嵌套的通用和通配符

时间:2018-08-14 09:16:23

标签: java generics

我有一些通用代码:

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> { }

1 个答案:

答案 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中的链接,其中将详细解释通配符嵌套。