java - 嵌套泛型和通配符

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

最佳答案

您无法指定此值,因为 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/

相关文章:

c# - .NET 是否有内置的 EventArgs<T>?

delphi - 是否有实现 QueryInterface 的泛型类型?

java - 如何限制泛型类中允许为 "T"的类型?

java - Wicket 倒数计时器不会自动更新

java - 程序结束时关闭java执行器服务

java - 模型映射器 - 如何映射不兼容的类型

java - 使用泛型参数列表的泛型方法声明

Java Generic - 构造函数调用的显式类型参数

Java 最新更新安全弹窗

java - 排序算法中的截止值是多少?