我有一些通用代码:
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> { }
答案 0 :(得分:2)
由于T1<T1<T1<?>>>
不是T1<T1<?>>
的实例,因此您无法分配它。
为什么?让我们分析一下:
T1<T1<T1<?>>>
:类型为T1
的{{1}}实例T1<T1<?>>
:类型为T1<T1<?>>
的{{1}}实例因此您无法分配,因为类型参数T1
与类型参数T1<?>
并不完全相同。
正如John Vernee在his comment中指出的那样,您需要T1<?>
才能正常工作,因为:
T1<T1<?>>
:类型为T1<? extends T1<?>>
或其子类型(例如T1<? extends T1<?>>
)的T1
实例 EDIT :为什么可以将T1<?>
(甚至是T1<T1<?>>
)分配给T1<T1<?>>
?因为:
T1<T1<T1<?>>
:T1<?>
的实例,其类型参数可以通过任何方式 更进一步:T1<?>
可以分配给以下类型,其中T1
更少:
T1<T1<T1<T1<?>>>
T1
T1<? extends T1<? extends T1<?>>
T1<? extends T1<?>
(对应于纯T1<?>
)我希望现在清楚这种嵌套的通用子类是如何工作的。
PS。点击this comment中的链接,其中将详细解释通配符嵌套。