- 16
- 0
public class Plate<T> {
private T item;
public Plate(T t){
item=t;
}
public void set(T t){
item=t;
}
public T get(){
return item;
}
public static void main(String[] args) {
Plate<String> [] arr=new Plate[10];
//Plate<String> [] arr2=new Plate<>[10];//编译错误
Plate<Integer> plate=new Plate<>(1);
Object[] arr1=arr;
arr1[0]=plate;
String a=arr[0].get();
}
}
请问为什么
Plate<String> [] arr=new Plate[10]
不报错,而
Plate<String> [] arr2=new Plate<>[10]
编译错误,
这两语句有什么不同?
-------------------------------后续补充--------------------------------
关于
in generics instantiation of arrays of parametrized types are illegal.
我是这样理解的,以一个例子说明一下:
static void test() {
Pair<Integer,Integer>[] intPairArr = new Pair<Integer,Integer>[10] ; // error
addElements(intPairArr);
Pair<Integer,Integer> pair = intPairArr[1];
Integer i = pair.getFirst();
pair.setSecond(i);
}
static void addElements( Object[] objArr) {
objArr[0] = new Pair<Integer,Integer>(0,0);
objArr[1] = new Pair<String,String>("",""); // should fail with ArrayStoreException
}
倘若支持,则我们调用addElements方法时,将其向上转型为Object[](数组支持协变,故编译通过),则继续添加元素时,则会编译通过,这样在运行时会出现arrayStoreException,Java引入泛型其中很重要的一点就是为了安全,将运行时的异常在编译时就暴漏出来,避免出现由于数组支持协变而导致的一些异常在编译期间无法发现,可以说,不支持泛型对象数组的创建就是因为数组有协变这一特性。
而答案中所说到的关于Java不支持泛型数组很好理解,举例说明:
T [] arr=new T[10];
这里我们假设T为String,由于Java的泛型采用擦除机制,只作用于编译时,编译之后则T都转化为Object,实际上创建的都是Object数组,则通过桥接方法转化为String时,则明显不对,故不支持泛型数组的创建。
我们可以通过迂回的方式来创建泛型数组,举例说明:
public T[] createArray(T[] arr){
T[] array= (T[]) new Object[arr.length];
for (int i = 0; i <arr.length ; i++) {
array[i]=arr[i];
}
return array;
}
实际上将传入的泛型数组copy到对应的Object数组中了。
最后一个问题,什么原因导致了Java支持数组协变这一可能出现问题的特性呢?
0
打赏
收藏
点击回答
- 共 0 条
- 全部回答
-
AI智能解答 超级管理员 2023-04-06 12:091楼Java 泛型是指在 Java 中使用参数化类型的一种机制,它允许程序员在编译时期检查类型安全,并且可以在运行时期提供更强大的类型安全性。它可以让程序员在编写代码时使用更加抽象的概念,从而提高代码的可读性和可维护性。
-
AI智能解答 超级管理员 2023-04-06 12:082楼Java 泛型是指在 Java 中使用参数化类型的一种机制,它允许程序员在编译时期检查类型安全,并且可以使用类型参数来创建可重用的组件,以便在多个类型之间重用代码。它还可以用来提高程序的可读性和可维护性。
更多回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

