下面这段代码为什么运行时会报错。。。
package test; public class TestGeneArray<T> { T[] array; @SuppressWarnings("unchecked") public TestGeneArray(int size){ array = (T[])new Object[size]; } public static void main(String args[]){ TestGeneArray<Integer> t1 = new TestGeneArray<Integer>(2); t1.array[0] = new Integer(1);//[Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer; } }
你这种写法在代码里是不被允许的,这与java泛型的实现原理有关,java泛型只是方便编码的一个语法糖,泛型代码会在编译的时候会进行类型擦除、 泛型相关代码会进行类型强转 ,回到你上面的代码里,变量array的类型在第7行编码上写死了是Object[],所以代码进过编译后会将Object[]强转成Interger[] 所以会报 [Ljava.lang.Object;cannotbecastto[Ljava.lang.Integer
一般在java中用想实现你想要的这种功能应当使用java集合来实现 如 List<T>array=newArrayList<T>(size);
你这种写法在代码里是不被允许的,这与java泛型的实现原理有关,java泛型只是方便编码的一个语法糖,泛型代码会在编译的时候会进行类型擦除、 泛型相关代码会进行类型强转 ,回到你上面的代码里,变量array的类型在第7行编码上写死了是Object[],所以代码进过编译后会将Object[]强转成Interger[] 所以会报 [Ljava.lang.Object;cannotbecastto[Ljava.lang.Integer
一般在java中用想实现你想要的这种功能应当使用java集合来实现 如 List<T>array=newArrayList<T>(size);
你这种写法在代码里是不被允许的,这与java泛型的实现原理有关,java泛型只是方便编码的一个语法糖,泛型代码会在编译的时候会进行类型擦除、 泛型相关代码会进行类型强转 ,回到你上面的代码里,变量array的类型在第7行编码上写死了是Object[],所以代码进过编译后会将Object[]强转成Interger[] 所以会报 [Ljava.lang.Object;cannotbecastto[Ljava.lang.Integer
一般在java中用想实现你想要的这种功能应当使用java集合来实现 如 List<T>array=newArrayList<T>(size);
这是《effectivejava》上的例子?
T[]array;@SuppressWarnings("unchecked")publicTEst(intsize){array=(T[])newObject[size];}publicvoidadd(){array[0]=(T)newInteger(1);}publicstaticvoidmain(Stringargs[]){TEst<Integer>t1=newTEst<Integer>(2);t1.add();}父类不能向子类转型
子类可以向父类转型
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。