Java 泛型 - 令人困惑的行为

标签 java generics

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

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/

相关文章:

java - Tomcat 服务器关闭时出现 NullPointerException

java - 如何在java中写入新的文本文件

java - 在崩溃之间保留数据

java - ClassCastException 使用 Class.cast 使用泛型

java - InstanceOf 方法在泛型中使用?

java - 抛出 RestClientException 时如何检索 HTTP 状态代码和响应正文?

java - 在 JAVA 的类格式中没有字段标志是什么意思?

c# - 如何检查 MethodInfo 是否匹配泛型 T 的委托(delegate),其中 T 是 Action 还是 Func?

java - 列表包含类型不安全的方法

c# - 我可以创建一个 List<WeakReference<T>> 吗?