gpt4 book ai didi

Java 泛型 - 令人困惑的行为

转载 作者:搜寻专家 更新时间:2023-10-31 19:38:33 24 4
gpt4 key购买 nike

我无法理解为什么会在此处出现编译错误。让我分享一些简单的代码。以下代码块工作正常:

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参数后它才提示这样的事情。再一次,我觉得我一定是在某个地方犯了一个愚蠢的错误,但我想不通。任何帮助,将不胜感激!谢谢!

最佳答案

在第一个示例中,您正在调用 MethodBString[]和一个 Integer[] .

由于数组是“协变的”——意思是,例如,您可以转换 String[]Object[] , 它调用 MethodB 的版本与 Object对于 E.

在第二个例子中,它是相似的,但你也有一个 List<E> .通用类以与数组相同的方式工作——你不能转换List<String>List<Object> .所以 E 是 Object 是无效的(或除 MethodA 中的 E 之外的任何其他内容)从那时起,第三个参数无法转换,并且 E 为 String 也是无效的从那时起第一个参数无法转换。所以没有适用于 E 的类型.

注意:如果你改变了StringIntegermain ,它仍然无法编译,即使 E可能是 Integer .那是因为编译器不知道 MethodA除了 Integer 之外,永远不会被调用.

关于Java 泛型 - 令人困惑的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25336993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com