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