我有一些通用代码:
T1<T1<T1<?>>> v1 = null;
T1<T1<?>> v2 = v1;
为此我收到此错误:
incompatible types: T1<T1<T1<?>>> cannot be converted to T1<T1<?>>
为什么我不能在这里分配?
如果是非嵌套通配符,一切正常:
T1<T1<?>> v1 = null;
T1<?> v2 = v1;
没有这样的问题。
T1
的定义
class T1<T> { }
最佳答案
您无法指定此值,因为 T1<T1<T1<?>>>
不是 T1<T1<?>>
的实例.
-
T1<T1<T1<?>>>
:T1
的一个实例其类型参数恰好是T1<T1<?>>
-
T1<T1<?>>
:T1
的一个实例其类型参数恰好是T1<?>
因此您无法分配,因为类型参数 T1<?>
与类型参数 T1<T1<?>>
不完全相同.
正如 John Vernee 在 his comment 中指出的那样,你需要T1<? extends T1<?>>
为此,因为:
-
T1<? extends T1<?>>
:T1
的一个实例其类型参数为T1<?>
或其子类型(如T1<T1<?>>
)
编辑:为什么你可以分配 T1<T1<?>>
(甚至 T1<T1<T1<?>>
)到 T1<?>
?因为:
-
T1<?>
:T1
的一个实例其类型参数可以是任何东西
更进一步:T1<T1<T1<T1<?>>>
可以分配给以下具有较少 T1
的类型s:
-
T1<? extends T1<? extends T1<?>>
-
T1<? extends T1<?>
-
T1<?>
-
Object
(对应于纯?
)
我希望现在已经清楚这个嵌套泛型子类是如何工作的。
PS。点击 this comment 中的链接,其中更详细地解释了通配符嵌套。关于java - 嵌套泛型和通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51837881/