首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么新列表= ArrayList<ArrayList<?>> ArrayList<ArrayList<String>>()不能编译?

为什么新列表= ArrayList<ArrayList<?>> ArrayList<ArrayList<String>>()不能编译?
EN

Stack Overflow用户
提问于 2013-05-24 22:21:38
回答 2查看 400关注 0票数 11

为什么要编译这段代码

代码语言:javascript
复制
final ArrayList<?> dp1 = new ArrayList<String>();

但这不是

代码语言:javascript
复制
final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-24 22:39:47

在……里面

代码语言:javascript
复制
final ArrayList<?> dp1 = new ArrayList<String>();

类型参数?是一个通配符,它是String的超集(不是超类型)。因此,ArrayList<?>ArrayList<String>的超级类型。

但在

代码语言:javascript
复制
final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();

类型参数ArrayList<?> (一个参数化类型,其中?只是代表一些未知类型,与String没有任何关系)不是通配符,通配符应该是? extends ArrayList<?>,有一个上限ArrayList<?>,它实际上是ArrayList<String>的超类型。

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

票数 6
EN

Stack Overflow用户

发布于 2013-05-24 22:38:57

这很难理解,但总而言之,在您的第一段代码中,String扩展了?,但第二段代码不能编译,因为ArrayList<String>不是直接从ArrayList<?>继承的。如果您想了解所有细节,可以查看here。如果您希望编译第二个示例,则必须将其修改为:

代码语言:javascript
复制
final ArrayList<? extends ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16737222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档