无与伦比的类型:java.lang.Class<capture#1 of ? 扩展 T[]> 和 java.lang.Class<java.lang.Object[]>



当我在数组类中使用一些方法时,我试图理解Java中的强制转换。

我正在使用IntelliJ IDEA,并在以下方法中

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
@SuppressWarnings("unchecked")
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}

在以下行中:

T[] copy = ((Object)newType == (Object)Object[].class)

IDE 建议强制转换为(对象(是多余的。

移除铸件会导致以下错误。

Incomparable types: java.lang.Class<capture#1 of ? extends T[]> and java.lang.Class<java.lang.Object[]>

这让我意识到起初错误是正确的,但尝试了一段时间让我意识到我不理解这个问题,因为重构代码就像 ->

T[] copy = (newType == (Object)Object[].class)

T[] copy = ((Object)newType == Object[].class)

不会产生此错误。

我不知道为什么它不会产生此错误,有人可以解释一下吗?

不可比拟的类型错误告诉您,比较两个不可能相等的东西是没有意义的。

例如,Integer.valueOf(0) == ""没有意义,因为它们不是同一类型;一个也不是另一个的超类型。它永远是错误的。

如果两者都是类类型(而不是接口(,编译器将阻止a == b,并且不允许a = bb = a

所以,你被告知Class<? extends T[]>不能等于Class<Object[]>,因为你不能将一种类型的引用分配给另一种类型的变量。

通过将其中一个引用转换为Object,编译器不再知道(/认为(这些类型绝对不相关 - 因为Object是一切的超类型,所以"一个也不是另一个的超类型"不再是真的 - 所以编译器允许检查。


该方法中多余的一件事是U.不需要它,只需在参数类型中使用Object[]即可。

相关内容

最新更新