开发者社区> 问答> 正文

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

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

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

展开
收起
kun坤 2020-05-29 22:39:51 646 0
1 条回答
写回答
取消 提交回答
  • 你这种写法在代码里是不被允许的,这与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);
    	}
    }
    ######

    引用来自“享开发”的评论

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

    引用来自“jorneyr”的评论

    问题不在第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);
    	}
    }
    对的 你这个办法是可以的 绕过了类型擦除 强制类型转换  如果要是这样做的话 最方便的做法就是将第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();
    }
    ###### 父类不能向子类转型 子类可以向父类转型
    2020-05-29 22:39:59
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
面向失败设计 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载