Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.util.Arrays.copyOf(U[],int,Class<;?扩展T[]>;)中通用通配符的优势_Java_Generics_Wildcard - Fatal编程技术网

java.util.Arrays.copyOf(U[],int,Class<;?扩展T[]>;)中通用通配符的优势

java.util.Arrays.copyOf(U[],int,Class<;?扩展T[]>;)中通用通配符的优势,java,generics,wildcard,Java,Generics,Wildcard,我一直在浏览java原生源代码,发现在java.util.Arrays.copyOf(U[],int,Class中明显使用了通用通配符,这与允许这样做的原因相同: Object[] o = new Integer[1]; 我想,这只是为了重新兼容/一致 如果我尝试将o数组中的一个位置设置为字符串,会发生一个运行时异常:S 这就是为什么裸数组有点坏的原因,你应该试着只在私有字段中使用它们,否则你最好只使用像List这样的集合。假设你有一只狗[]和一只动物[],你想把你的狗[]复制到动物[]: D

我一直在浏览java原生源代码,发现在
java.util.Arrays.copyOf(U[],int,
Class中明显使用了通用通配符,这与允许这样做的原因相同:

Object[] o = new Integer[1];
我想,这只是为了重新兼容/一致

如果我尝试将
o
数组中的一个位置设置为字符串,会发生一个运行时异常:S


这就是为什么裸数组有点坏的原因,你应该试着只在私有字段中使用它们,否则你最好只使用像
List
这样的集合。

假设你有一只
狗[]
和一只
动物[]
,你想把你的
狗[]
复制到
动物[]

Dog[] dogArray = whatever;
Animal[] animalArray = whatever;
Animal[] copy = Arrays.copyOf(dogArray, dogArray.length, animalArray.getClass());

animalArray.getClass()
返回一个
ClassAhh,我明白了。我想我的想法是基于一个关于泛型的错误假设:类型
T[]
不是由类型参数
newType
决定的,而是由方法返回值被分配到的变量类型决定的(在您的例子中是“
copy
”),不是吗?-如果是,为什么是
U
(在
中)没有声明为
那么?@Reizo:不,它是由
newType
决定的。你分配给它的变量与它无关。至于为什么没有声明它
U扩展T
,这是因为
U
不必扩展
T
。例如,你可能正在使用一个
对象[]
只保存
整数
s并将其复制到
整数[]
tArray.getClass()
返回一个
Class@user102008:…废话,我想你是对的。我忘了
getClass
在那里进行擦除。也许我在写这篇文章或其他东西的时候把
U
T
看作是具体的类型。我想我需要修改它。@user102008:我想我已经解决了一些问题。
Dog[] dogArray = whatever;
Animal[] animalArray = whatever;
Animal[] copy = Arrays.copyOf(dogArray, dogArray.length, animalArray.getClass());
Animal[] copy = Arrays.copyOf(dogArray, dogArray.length, animalArray.getClass());