Java 泛型 集合引用赋值问题(或方法传参)
2013-01-07 16:31
471 查看
迷茫点A
而下面有全可以
为何会这样,全是因为java的泛型是伪泛型,假设说迷茫点A b = a是成功的(a = b成功是不可能的,即使在普通类型也需要强制转换),那么我们来分析一些过程。
a的引用使用了泛型,当a被编译了以后,生成的class中,a变成了List a,而把String去掉了。同理b 变成了List b;
那么这样a,b其实可以包含任何类型的对象。那么现在把a的引用复制给b,b这个时候如果add一个Integer对象,是完全可以的。b增加一个是没问题,但是其实a也增加了一个Integer对象,这个时候问题就出现了。因为a里面需要放的是String对象,但是编译过后,a并不一定要放String,那么在a中放入Integer也是可以的,这与客户期望的完全不同。所以为了避免这样的运行时错误在编译的时候java就组织了这个问题。
但是当时a,b都是数组的时候就不会有这个问题,在运行的时候就会出错,这个需要程序员自己去检查不要犯这样的错误。
当把a引用赋值给b后,在b数组中添加一个Integer,编译的时候是不会出错的,但是运行的时候就报错。
泛型还是可以指定边界的,上面的例子没有指定,默认就是Object,如果指定了边界在编译的时候,就指定最低也是这样的类型。
List<String> a = null; List<Object> b = null; a = b;//compile error b = a;//compile error
而下面有全可以
Object a = null; String b = null; a = b; b = (String) a; String[] a = null; Object[] b = null; a = (String[]) b; b = a;
为何会这样,全是因为java的泛型是伪泛型,假设说迷茫点A b = a是成功的(a = b成功是不可能的,即使在普通类型也需要强制转换),那么我们来分析一些过程。
a的引用使用了泛型,当a被编译了以后,生成的class中,a变成了List a,而把String去掉了。同理b 变成了List b;
那么这样a,b其实可以包含任何类型的对象。那么现在把a的引用复制给b,b这个时候如果add一个Integer对象,是完全可以的。b增加一个是没问题,但是其实a也增加了一个Integer对象,这个时候问题就出现了。因为a里面需要放的是String对象,但是编译过后,a并不一定要放String,那么在a中放入Integer也是可以的,这与客户期望的完全不同。所以为了避免这样的运行时错误在编译的时候java就组织了这个问题。
但是当时a,b都是数组的时候就不会有这个问题,在运行的时候就会出错,这个需要程序员自己去检查不要犯这样的错误。
当把a引用赋值给b后,在b数组中添加一个Integer,编译的时候是不会出错的,但是运行的时候就报错。
泛型还是可以指定边界的,上面的例子没有指定,默认就是Object,如果指定了边界在编译的时候,就指定最低也是这样的类型。
List<? extends String> a = null; List<? extends Integer> b= null;他们在编译的时候a就是不是List a了,而是List<String> a
相关文章推荐
- Java中泛型集合List<T>反序列化问题及解决方法
- (集合和引用类型、基本数据类型赋值不一样)一个简单的java问题 先后的赋值问题
- Java方法传参的值传递和引用传递的区别(code)
- Java中传参的值传递和引用传递问题(转)
- java泛型编译时被擦除引起多态的破坏,用 桥方法解决此类问题。(java 桥方法)
- java 方法参数-值调用,引用调用问题
- Java多态和实现接口的类的对象赋值给接口引用的方法
- Java集合中的泛型与多态问题
- java 方法传参是引用传递还是值传递
- java方法传值还是传引用的问题
- 牛客网Java刷题知识点之泛型概念的提出、什么是泛型、泛型在集合中的应用、泛型类、泛型方法、泛型接口、泛型限定上限、泛型限定下限、 什么时候使用上限?泛型限定通配符的体现
- Java集合初始化赋值等相关问题
- Java初学习 - 多态和实现接口的类的对象赋值给接口引用的方法
- java序列化的引用问题以及将transitent的序列化方法
- Java集合HashSet的hashcode方法引起的内存泄漏问题
- 用JAXB转换XML和Java对象时的循环引用问题的解决方法
- 关于java基础类型与引用类型内存存储问题,以及string.intern()方法(String两种创建方式的区别)
- java 引用类型作为方法参数使用问题
- java中给集合赋值的方法
- HTML 注册事件向引用方法中的传参问题的两个方式