比如说: 1 List list = new ArrayList(); 这时候 list什么都能add进去, list1.add(a); list1.add(stu);2 List<Student> list = new ArrayList<Student>(); 但是这时候list 只能add Student 这个对象。不能add其它的。 这有一个好处,就是在取的时候不用类型强制转换,也不容易出错。
泛型只是在编译时起作用,运行时是没有泛型信息的。也就是说:源文件当中的List<Object>和List<String>被javac编译器编译完成以后,jvm在运行时看到的都只是List。public void func(List<String> list){ } public void func(List<Integer> list){ }以上两个方法不是overload,不能在同一个类里面共存的,eclipse提示: Method func(List<String>) has the same erasure func(List<E>) as another method in type GenericTest。
public static void main(String[] args)throws Exception { List<Integer> list = new ArrayList<Integer>(); list.add(100); Method method = list.getClass().getDeclaredMethod("add",Object.class); method.invoke(list, "hello"); System.out.println(list); } //这个例子说明,运行时,jvm只是知道List里面装的是Object,虽然定义的时候规定了只能往里面放Integer,实际上我们还是可以往里面放String。
擦除是擦除成object了
Java中的泛型是个假泛型,仅仅只是在编译器那边做了语法检查而已,和C#里的泛型不一样的。
基本上,不管你在List<>里面写什么类型,编译通过了以后运行时全部都是Object。
Java泛型是通过类型擦除实现的,编译器的语法检查是次要的,重要的是泛型系统可以为我们做更多的类型检查,这在很多时候是很有帮助的,借助编译器在编译期的类型检查可以减少运行时出现类型错误的几率。另外thinking in java里也有仔细的讲解
啊那个 没经历过那个年代。。大侠请问1.4之前的List里面是不是都是Object啊?那是不是List<Object>就相当于1.4之前的了?
1
List list = new ArrayList();
这时候 list什么都能add进去, list1.add(a); list1.add(stu);2
List<Student> list = new ArrayList<Student>();
但是这时候list 只能add Student 这个对象。不能add其它的。
这有一个好处,就是在取的时候不用类型强制转换,也不容易出错。
放的是Object和原本的List一样
如果是List<String>那就只能放String
}
public void func(List<Integer> list){
}以上两个方法不是overload,不能在同一个类里面共存的,eclipse提示:
Method func(List<String>) has the same erasure func(List<E>) as another method in type GenericTest。
public static void main(String[] args)throws Exception {
List<Integer> list = new ArrayList<Integer>();
list.add(100);
Method method = list.getClass().getDeclaredMethod("add",Object.class);
method.invoke(list, "hello");
System.out.println(list);
}
//这个例子说明,运行时,jvm只是知道List里面装的是Object,虽然定义的时候规定了只能往里面放Integer,实际上我们还是可以往里面放String。