开发者社区> 问答> 正文

求大神给解答下这个代码为何会出错?报错

下面这段代码为什么运行时会报错。。。

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;
	}
}



展开
收起
爱吃鱼的程序员 2020-06-22 10:43:39 531 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    你这种写法在代码里是不被允许的,这与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();}



    父类不能向子类转型

    子类可以向父类转型

    2020-06-22 10:43:56
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
《0代码搭应用》 立即下载
不止代码 立即下载
面向失败设计 立即下载