为什么这段代码可以编译通过
final ArrayList<?> dp1 = new ArrayList<String>();
但是这并不
final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();
为什么这段代码可以编译通过
final ArrayList<?> dp1 = new ArrayList<String>();
但是这并不
final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();
String
继承自 ?
,但第二个代码由于 ArrayList<String>
不直接继承自 ArrayList<?>
而无法编译通过。如果您想了解更多详细信息,可以在这里查看:这里。
如果您希望您的第二个示例编译通过,则必须将其修改为此形式:final ArrayList<? extends ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();
class P {}
和class C extends P {}
,那么我就可以执行ArrayList <P> a = new ArrayList <C>();
? - Bhesh GurungIn
final ArrayList<?> dp1 = new ArrayList<String>();
类型参数 ?
是一个通配符,它是 String
的超集(而非父类)。因此,ArrayList<?>
是 ArrayList<String>
的超类型。
但在
final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();
ArrayList<?>
(一个参数化类型,其中?
只代表某种未知类型,与String
无关)不是通配符,通配符应该是? extends ArrayList<?>
,具有上限ArrayList<?>
,实际上是ArrayList<String>
的超类型。您可以在此处阅读有关参数化类型中超/子集/类型规则的信息。