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

and*_*enu 6 java generics compiler-errors wildcard

我大大简化了我的问题.这是它的读法.

我试图弄清楚为什么以下代码无法编译:

 List<AnonType<AnonType<?>>> l = new ArrayList<AnonType<AnonType<?>>>();
 l.add( new AnonType<AnonType<String>>() );
Run Code Online (Sandbox Code Playgroud)

哪里

public class AnonType<T> {
  T a;

  List<T> b;
}
Run Code Online (Sandbox Code Playgroud)

编译器错误表示add不适用于给定的参数.OTOH,以下代码只有1级嵌套通配符完美编译:

List<AnonType<?>> l = new ArrayList<AnonType<?>>();
l.add( new AnonType<String>() );
Run Code Online (Sandbox Code Playgroud)

pol*_*nts 7

以下编译符合预期:

    List<Set<? extends Set<?>>> list = new ArrayList<Set<? extends Set<?>>>();
    list.add(new HashSet<Set<String>>());
    list.add(new HashSet<Set<Integer>>());
Run Code Online (Sandbox Code Playgroud)

问题是泛型是类型不变的.

考虑一个更简单的例子:

  • 鉴于有铸造转换AnimalDog(例如Dog extends Animal)......
    • 一个List<Animal> IS NOT一个List<Dog>
  • List<? extends Animal>a到a 的捕获转换List<Dog>

现在,这是在这种情况下发生的事情:

  • 鉴于有一个捕获转换Set<?>Set<String>...
    • 一个Set<Set<?>> IS NOT一个Set<Set<String>>
  • 有一个捕捉转换,从Set<? extends Set<?>>Set<Set<String>>

所以,如果你想List<T>在这里你可以添加Set<Set<String>>,Set<Set<Integer>>等等,那么T不是 Set<Set<?>>,而是Set<? extends Set<?>>.

相关问题

也可以看看