【问题标题】:Nested generic and wildcard [duplicate]嵌套泛型和通配符[重复]
【发布时间】:2018-08-14 09:16:23
【问题描述】:

我有一些通用代码:

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

【问题讨论】:

  • 您打算通过创建这样的 3 级嵌套来解决的真正问题是什么?
  • 是简化的例子。在实际应用中,我在每个级别都有不同的类,其中一些有多个通用参数。
  • 我很确定您的请求中有一个很好的重复问题,但是很遗憾,我现在找不到它;-)
  • 这样的事情非常接近你的要求:stackoverflow.com/q/26766704 但从技术上讲,这也是一个骗局:stackoverflow.com/q/2745265 长话短说:你需要T1&lt;? extends T1&lt;?&gt;&gt; v2 = v1;

标签: java generics


【解决方案1】:

您不能分配它,因为T1&lt;T1&lt;T1&lt;?&gt;&gt;&gt; 不是T1&lt;T1&lt;?&gt;&gt; 的实例。

为什么?我们来分析一下:

  • T1&lt;T1&lt;T1&lt;?&gt;&gt;&gt;T1 的实例,其类型参数正好是 T1&lt;T1&lt;?&gt;&gt;
  • T1&lt;T1&lt;?&gt;&gt;T1 的实例,其类型参数正好是 T1&lt;?&gt;

所以你不能赋值,因为类型参数T1&lt;?&gt;与类型参数T1&lt;T1&lt;?&gt;&gt;不完全相同。

正如 John Vernee 在 his comment 中指出的那样,您需要 T1&lt;? extends T1&lt;?&gt;&gt; 才能使其工作,因为:

  • T1&lt;? extends T1&lt;?&gt;&gt;T1 的实例,其类型参数为 T1&lt;?&gt; 或其子类型(如 T1&lt;T1&lt;?&gt;&gt;

编辑:为什么可以将T1&lt;T1&lt;?&gt;&gt;(甚至T1&lt;T1&lt;T1&lt;?&gt;&gt;)分配给T1&lt;?&gt;?因为:

  • T1&lt;?&gt;T1 的一个实例,其类型参数可以是anything

更进一步:T1&lt;T1&lt;T1&lt;T1&lt;?&gt;&gt;&gt; 可以分配给以下具有较少T1s 的类型:

  • T1&lt;? extends T1&lt;? extends T1&lt;?&gt;&gt;
  • T1&lt;? extends T1&lt;?&gt;
  • T1&lt;?&gt;
  • Object(对应纯?

我希望现在这个嵌套的泛型子类化是如何工作的很清楚了。

PS。关注this comment 中的链接,其中更详细地解释了通配符嵌套。

【讨论】:

  • 基于这个逻辑,我的第二个例子也不应该工作,因为T1&lt;?&gt;1 is not exactly ?`,但它工作正常。
  • @talex 查看我的编辑。我希望它能为你澄清事情。
猜你喜欢
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
相关资源
最近更新 更多