java.util.Arrays.copyOf(U[],int,Class<;?扩展T[]>;)中通用通配符的优势
我一直在浏览java原生源代码,发现在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.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());