【问题标题】:Java Generics difference between T and ? extends TJava 泛型 T 和 ? 之间的区别扩展 T
【发布时间】:2013-10-19 19:44:16
【问题描述】:

有效。

方法声明

<T> Session<T> start(Criteria<T> criteria, List<Property<T>> orders);

用法

Criteria<? extends Product> criteria = Utils.getCriteria();
Session<? extends Product> session = null;
session = Service.start(criteria, null);

它不起作用。

方法声明

<T> List<Session<T>> start(Criteria<T> criteria, List<Property<T>> orders)

用法

Criteria<? extends Product> criteria = Utils.getCriteria();
List<Session<? extends Product>> sessions = null;
sessions = Service.start(criteria, null);

错误信息

Type mismatch: cannot convert from List<Session<capture#2-of ? extends Product>> to List<Session<? extends Product>>

如果我将方法声明更改为此,它可以工作。

<T> List<Session<? extends T>> start(Criteria<? extends T> criteria, List<Property<? extends T>> orders)

为什么这个方法声明不起作用?

<T> List<Session<T>> start(Criteria<T> criteria, List<Property<T>> orders)

【问题讨论】:

  • 您的方法声明是否与您的代码中的相同? Criteria&lt;? extends T&gt; 不能接受 List&lt;Criteria&lt;? extends Product&gt;&gt;
  • 我的错,代码和我的不一样。我修改了代码。
  • 你还需要出示criteria的声明。
  • 我修改了代码。
  • @JudgeMental 已经给出了问题的答案。你也可以去throughthese posts深入了解多级通配符的实际工作原理。

标签: java generics wildcard extends


【解决方案1】:

这就是发生的事情:您使用通配符类型? extends Product 的实际参数调用start(),因此编译器推断该类型,将CAP#2 之类的捕获变量替换为?,替换为@987654325 @ 在开始的调用中。因此出来的类型是List&lt; Session&lt; CAP#2 &gt; &gt;,我们只知道CAP#2 is-a Product

您正在尝试将该结果分配给类型为List&lt; Session&lt; ? extends Product &gt; &gt; 的变量,该变量表示会话的异构列表。我敢打赌,如果你将它分配给List&lt; ? extends Session&lt; ? extends Product &gt; &gt; 类型的变量,它会起作用。

规则是这样的:

( ∀S : S is-a T ) G< S > is-a G< ? extends T >                       [1]

所以:

( ∀S : S is-a T ) Session< S > is-a Session< ? extends T >           [2]

特别是,由于CAP#2 is-a Product,从[2]我们得到:

Session< CAP#2 > is-a Session< ? extends Product >                   [3]

但是:

List< Session< CAP#2 > > is-NOT-a List< Session< ? extends Product > >

但是,从 [1] 和 [3] 我们得到:

List< Session< CAP#2 > > is-a List< ? extends Session< ? extends Product > >

无论如何,我建议对您的客户最慷慨的声明如下:

< T > List< Session< T > > start(
    Criteria< ? extends T > criteria,
    List< ? extends Property< ? extends T > > orders
)

【讨论】:

  • 很好地解释了各种实例之间的继承关系。 +1
猜你喜欢
  • 2021-12-18
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 2023-02-02
  • 2020-01-02
  • 2015-11-15
相关资源
最近更新 更多