Java 包装泛型编译错误

标签 java

我有一个非常基本的代码来重现这个问题:

public class Main {
  public static <T extends Number> void bar(Wrapper<List<T>> wrapper) {
    // do something
  }

  public static void foo(Wrapper<List<? extends Number>> wrapper) {
    // do something
  }

  public static <T extends Number> void bar2(List<T> aList) {
    // do something
  }

  public static void foo2(List<? extends Number> aList) {
    // do something
  }

  public static void main(String[] args) {
    List<Integer> aList = Collections.singletonList(1);
    foo2(aList); // compiles
    bar2(aList); // compiles

    Wrapper<List<Integer>> wrapper = new Wrapper<>(Collections.singletonList(1));
    foo(wrapper); // not compiles
    bar(wrapper); // compiles
  }

  private static class Wrapper<T> {
    private final T t;

    public Wrapper(T t) {
      this.t = t;
    }
  }
}

所以问题是为什么在我尝试编译代码时 javac 会报错:

Main.java:26: error: method foo in class Main cannot be applied to given types;
    foo(wrapper); // not compiles
    ^
  required: Wrapper<List<? extends Number>>
  found: Wrapper<List<Integer>>
  reason: argument mismatch; Wrapper<List<Integer>> cannot be converted to Wrapper<List<? extends Number>>
1 error

最佳答案

Wrapper<List<Integer>>不是 Wrapper<List<? extends Number>> 的子类型.

使用 Wrapper<? extends List<? extends Number>> .


看看为什么不能通过Wrapper<List<Integer>>foo ,请考虑以下事项:我已经替换了 WrapperList ,但从类型安全的角度来看,这是一回事。

List<List<? extends Number>> list = new ArrayList<>();
List<List<Integer>> intList = new ArrayList<>();

因此,您可以向 list 添加一些内容:

List<Double> doubles = new ArrayList<>(Arrays.asList(0.0));
list.add(doubles);

但是,如果你能写出这个作业:

list = intList;

然后调用list.add(doubles)意味着会有一个List<Double>intList .这不是类型安全的,因此被禁止。

Ideone demo

但是,如果list类型为 List<? extend List<? extends Number>> , 那么你就不能调用 add在上面,这样你就不会陷入这种情况,这样就安全了。

关于Java 包装泛型编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42645635/

相关文章:

java - getModifiers() 方法如何计算多个修饰符的值?

java - 排序后的 map 不输出排序。我懂 map 吗?

java - Java套接字中的函数 'receive'是如何设计的?

java - 如何消除代码味道: getSessionFactory,仅在必要时创建SessionFactory

java - CookieHandler 还是 org.apache.http.cookie 哪种方式更好?

java - 有没有办法将从所有组合框中选择的值添加到 1 个文本字段中?

Java 日期和时间格式

java - POJO 中没有 getter 方法不会通过 setter 方法设置值

java - 在JavaFX的FXML中,如何声明自定义事件的处理程序?

java - 返回子句失败(postgres 9.3,jdbc)