java - 为什么 ArrayList<ArrayList<?>> list = new ArrayList<ArrayList<String>>() 无法编译?

标签 java generics

<分区>

为什么这段代码可以编译

final ArrayList<?> dp1 = new ArrayList<String>();

但这不是

final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();

最佳答案

final ArrayList<?> dp1 = new ArrayList<String>();

类型参数 ?是一个通配符,它​​是 String 的超集(不是父类(super class)型) .所以,ArrayList<?>ArrayList<String> 的 super 类型.

但是在

final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();

类型参数 ArrayList<?> (参数化类型,其中 ? 仅代表某种未知类型,与 String 没有任何关系)不是通配符,通配​​符将是 ? extends ArrayList<?> , 上限为 ArrayList<?> , 它实际上是 ArrayList<String> 的父类(super class)型.

您可以在参数化类型中阅读有关 super /子集/类型的规则 here .

关于java - 为什么 ArrayList<ArrayList<?>> list = new ArrayList<ArrayList<String>>() 无法编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16737222/

相关文章:

java - 将 Date 对象转换为日历对象

java - 为什么 logstash 需要这么长时间才能启动/加载?

c# - 指定接口(interface)只能由引用类型实现 C#

c# - 如何在泛型类中访问 T 类型的静态属性?

typescript - 我如何定义将键映射到该键的泛型的类型,例如Record<K, SomeGeneric<key>>?

java - 多人游戏客户端/服务器架构 RMI/JMS/Sockets

java - 在android中比较日期与毫秒

java - 为什么这个 lambda 函数在错误的类加载器中启动类加载?

java - 有没有一种方法可以在不进行强制转换的情况下解决不明确的方法调用?

java - 为什么泛型类和方法声明中不能使用通配符?