有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java多个嵌套通配符参数不适用

我已经大大简化了我的问题。下面是它的内容

我试图弄明白为什么下面的代码无法编译:

 List<AnonType<AnonType<?>>> l = new ArrayList<AnonType<AnonType<?>>>();
 l.add( new AnonType<AnonType<String>>() );

在哪里

public class AnonType<T> {
  T a;

  List<T> b;
}

编译器错误是add不适用于给定的参数。OTOH,以下代码只包含1级嵌套通配符,可以完美编译:

List<AnonType<?>> l = new ArrayList<AnonType<?>>();
l.add( new AnonType<String>() );

共 (1) 个答案

  1. # 1 楼答案

    以下内容按预期编译:

        List<Set<? extends Set<?>>> list = new ArrayList<Set<? extends Set<?>>>();
        list.add(new HashSet<Set<String>>());
        list.add(new HashSet<Set<Integer>>());
    

    问题是泛型是类型不变的

    考虑更简单的例子:

    • 假设存在从AnimalDog(例如Dog extends Animal)的强制转换。。。
      • AList<Animal>不是AList<Dog>
    • 有一个从List<? extends Animal>List<Dog>的捕获转换

    下面是在这种情况下发生的情况:

    • 假设有一个从Set<?>Set<String>的捕获转换。。。
      • ASet<Set<?>>不是ASet<Set<String>>
    • 有一个从Set<? extends Set<?>>Set<Set<String>>的捕获转换

    因此,如果你想要一个List<T>,在那里你可以添加Set<Set<String>>Set<Set<Integer>>等等,那么T不是{},而是Set<? extends Set<?>>

    相关问题

    另见