我无法理解为什么我在这里遇到编译错误。让我分享一些简单的代码。下面的代码块工作正常:
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
}
}
这给了我以下错误:
线程“main”java.lang.Error中出现异常:未解决的编译问题:
Test 类型中的方法 MethodB(E[], E[], List) 不适用于参数 (E[], Integer[], List)
它似乎在告诉我将参数从 E[] 更改为 Integer[],这很奇怪,因为直到我引入 List 参数之后它才抱怨这样的事情。我再次觉得我一定在某个地方犯了一个愚蠢的错误,但我无法弄清楚。任何帮助,将不胜感激!谢谢!
在第一个示例中,您调用MethodB
with a String[]
and an Integer[]
.
由于数组是“协变”的 - 这意味着,例如,您可以转换String[]
to an Object[]
,它调用的版本MethodB
with Object
for E.
在第二个示例中,它是类似的,但你还有一个List<E>
。通用类做not与数组的工作方式相同 - 你cannot cast a List<String>
to a List<Object>
。所以 E 是无效的Object
(或者除 E 之外的任何内容MethodA
) 之后第三个参数就无法转换了,E 也无效String
从那时起第一个参数无法转换。所以没有适合的类型E
.
注意:如果你改变了String
to Integer
in main
,它仍然无法编译,尽管E
可能Integer
。那是因为编译器不知道MethodA
从未被其他任何东西调用过Integer
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)