• java 泛型研究 初探索(一)


    看一段程序先:

     1 package daxue.test;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Date;
     5 import java.util.List;
     6 
     7 public class Test {
     8  public static void main(String[] args) {
     9   
    10 //定义一个参数类型为String的List,名字为list_str
    11   List<String> list_str =  new ArrayList<String>();
    12   list_str.add("abc");
    13   
    14 
    15  //又定义一个参数类型为Date的List,名字为list_date
    16   List<Date> list_date = new ArrayList<Date>();
    17 
    18 
    19  //定义一个没有参数的List,名字为list
    20 //将list_str赋值给list
    21   List list = list_str;  
    22 
    23 
    24 //再将list赋值给list_date
    25   list_date = list;
    26   list_date.add(new Date());
    27 
    28 
    29   System.out.println(list_date);
    30 
    31   for (Date date : list_date) {
    32    System.out.println(date);
    33   }
    34  }
    35 }

            上边这个程序运行到for循环的地方就出错了,原因很简单,我们通过反复赋值,将list_date最终指向了list_str,也就是说 list_date 和 list_str 现在指向了同一个List,标记为AList。我们可以通过 list_date向AList添加Date类型的对象,我们也可以通过list_str向AList中添加String类型的变量。AList中既有String类型的变量,又有Date类型的变量,所以在for循环的时候把String类型的变量强制转换为Date 类型的时候出错了。。。。

            于是,我们就引出了“类型擦除”这个概念:编译器编译后,在生成的Java字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个过程就称为类型擦除。如在代码中定义的List<Date>和List<String>等类型,在编译之后都会变成List。

            也就是说:编译器编译后的List只是一个普通的List,因此它才不会管我们往里边放什么类型的对象,java5的泛型机制,只是停留在编译之前,通过在语法上限制你不能往list_str中放入其他对象。

            java在版本5才出现了泛型的概念,那么它为了兼容5以前的版本,所以在赋值的时候它允许我们这样赋值:

            1: List list = new ArrayList<String>()

            2: List<Date> list_date  = new ArrayList()

            在等号的两边,允许有一边使用泛型,编译器能通过,但只给出警告。因为编译器是在你是确定这样赋值不会出错的情况下,使得赋值成立的。

            我们利用这种赋值,巧妙的躲开了编译器的语法限制。

            另外需要注意的就是:赋值时,在泛型参数没有上溯、下溯的概念,3和4的赋值方式是不允许的,尽管我们认为Object是String的父类。

            3:List<Object> list_obj = new ArrayList<String>()

            4:List<String> list_str = new ArrayList<Object>()

  • 相关阅读:
    Python日期和时间
    Python实现ATM
    XML的ElementTree解析方式
    Python多线程
    Python文件操作
    Python错误和异常
    Python基础第四课
    html页面引入另一个html页面
    微信直播video安卓端始终在最顶层的解决方法
    设计模式之 外观模式
  • 原文地址:https://www.cnblogs.com/ishang/p/2579708.html
Copyright © 2020-2023  润新知