Java 嵌套ArrayList初始化是否有问题?

Java 嵌套ArrayList初始化是否有问题?,java,generics,collections,bounded-wildcard,Java,Generics,Collections,Bounded Wildcard,考虑以下几类: class A{ } class B extends A{ } 正如我们所知,这可以很好地编译: List<? extends A> xx = new ArrayList<B>(); List<? extends List<? extends A>> xy = new ArrayList<List<? extends A>>(); List正在创建的类实例的类型参数不能是通配符(): 如果[type ar

考虑以下几类:

class A{ }
class B extends A{ }
正如我们所知,这可以很好地编译:

List<? extends A> xx = new ArrayList<B>();
List<? extends List<? extends A>> xy = new ArrayList<List<? extends A>>();

List正在创建的类实例的类型参数不能是通配符():

如果[type arguments]紧跟在
new
之后或紧跟在
)之前,则如果任何类型参数是通配符,则是编译时错误


差不多就是这样。类型参数可能包含通配符(如在构造/防御泛型类型时的新ArrayList中),必须指定类型。这两个

? extends A
? extends List<? exetnds A>
B
List<? extends A>
你会遇到同样的问题


可以理解?

此错误是指创建新的
ArrayList
,其直接的顶级类型参数使用通配符。这是不允许的,尽管允许嵌套类型参数使用通配符

报告指出:

如果类型参数紧跟在
new
之后,或紧跟在
)之前,则如果任何类型参数是通配符(),则是编译时错误

这里的关键字是“立即”,因为它表示直接类型参数,而不是嵌套类型参数

以下是中提到的限制:

它们是[通配符]不能用于创建对象或数组,也就是说,新表达式中不允许使用通配符实例化。通配符实例化不是类型,它们是类型族成员的占位符。在某种程度上,通配符实例化类似于接口:我们可以声明接口类型的变量,但我们不能创建接口类型的对象;创建的对象必须是实现接口的类类型。与通配符实例化类似:我们可以声明通配符实例化类型的变量,但我们不能创建此类类型的对象;创建的对象必须是来自即时类族的具体实例化由通配符实例化指定的iations

(强调矿山)

基本上,通配符类型不是一个具体的类型,并且不能被实例化,原因与不允许直接创建接口实例类似

但是,这与嵌套通配符无关,嵌套通配符与创建最初不相关的对象有关,这些对象最终可能与此类型关联。在您的示例中,这将是嵌套的
列表
s,可以添加到外部
数组列表
。它们可以是对任何匹配wil的
列表
s的引用dcard类型,但它们不是在这里创建的

摘要


Java不允许在实例创建表达式中使用通配符(使用
new
),但它确实允许在这样的表达式中使用嵌套通配符,因为直接通配符类型不是具体的类型。

您有没有不使用
的充分理由?@AndyTurner,我只想简单地理解错误消息想要说什么。
? extends A
? extends List<? exetnds A>
B
List<? extends A>
new ArrayList<B>();
new ArrayList<List<? extends A>>();
new ArrayList<? extends A>();