我无法理解为什么会在此处出现编译错误。让我分享一些简单的代码。以下代码块工作正常:
public class Test {
public static void main(String[] args) {
String[] arr = new String[0];
MethodA(arr);
}
public static <E> void MethodA(E[] array) {
Integer[] intArray = new Integer[0];
MethodB(array, intArray);
}
public static <E> void MethodB(E[] array, E[] secondArray) {
//Stuff
}
}
当我向 MethodB 添加一个新的通用 List 参数并从 MethodA 调用它时,问题出现了:
public class Test {
public static void main(String[] args) {
String[] arr = new String[0];
MethodA(arr);
}
public static <E> void MethodA(E[] array) {
Integer[] intArray = new Integer[0];
List<E> someList = new ArrayList<E>();
MethodB(array, intArray, someList);
}
public static <E> void MethodB(E[] array, E[] secondArray, List<E> list) {
//Stuff
}
}
这给了我以下错误:
Exception in thread "main" java.lang.Error: Unresolved compilation problem: The method MethodB(E[], E[], List) in the type Test is not applicable for the arguments (E[], Integer[], List)
它似乎是在告诉我把参数从E[]改成Integer[],这很奇怪,因为直到我引入List参数后它才提示这样的事情。再一次,我觉得我一定是在某个地方犯了一个愚蠢的错误,但我想不通。任何帮助,将不胜感激!谢谢!
最佳答案
在第一个示例中,您正在调用 MethodB
用String[]
和一个 Integer[]
.
由于数组是“协变的”——意思是,例如,您可以转换 String[]
到Object[]
, 它调用 MethodB
的版本与 Object
对于 E.
在第二个例子中,它是相似的,但你也有一个 List<E>
.通用类不以与数组相同的方式工作——你不能转换List<String>
到 List<Object>
.所以 E 是 Object
是无效的(或除 MethodA
中的 E 之外的任何其他内容)从那时起,第三个参数无法转换,并且 E 为 String
也是无效的从那时起第一个参数无法转换。所以没有适用于 E
的类型.
注意:如果你改变了String
至 Integer
在main
,它仍然无法编译,即使 E
可能是 Integer
.那是因为编译器不知道 MethodA
除了 Integer
之外,永远不会被调用.
关于Java 泛型 - 令人困惑的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25336993/