为什么这段代码会编译
final ArrayList<?> dp1 = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)
但事实并非如此
final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();
Run Code Online (Sandbox Code Playgroud)
理解它是相当复杂的,但总结在你的第一个代码中,String扩展?但第二个不编译,因为ArrayList<String>不直接继承ArrayList<?>你可以看看这里,如果你想要所有的细节.如果您想要编译第二个示例,则必须将其修改为:
final ArrayList<? extends ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();
Run Code Online (Sandbox Code Playgroud)
在
final ArrayList<?> dp1 = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)
type参数?是一个通配符,它是超集(不是超类型)String.所以,ArrayList<?>是超级型的ArrayList<String>.
但在
final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();
Run Code Online (Sandbox Code Playgroud)
类型参数ArrayList<?>(参数化类型,其中?只代表某些未知类型,并且与之无关String)不是通配符,通配符将是? extends ArrayList<?>上限ArrayList<?>,实际上是超类型ArrayList<String>.
您可以在此处阅读有关参数化类型中超级/子集/类型的规则.
| 归档时间: |
|
| 查看次数: |
387 次 |
| 最近记录: |