Java泛型与T和?的区别?延伸T.

时间:2013-10-19 19:44:16

标签: java generics wildcard extends

它有效。

方法声明

<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)

1 个答案:

答案 0 :(得分:5)

以下是正在发生的事情:您使用通配符类型start()的实际参数调用? extends Product,因此编译器推断出该类型,在CAP#2之类的捕获变量中替换{ {1}},用于启动调用中的?。因此,出现的类型属于T类型,我们所知道的就是List< Session< CAP#2 > >

您正尝试将该结果分配给CAP#2 is-a Product类型的变量,该变量表示会话的异构列表。我敢打赌,如果你把它分配给List< Session< ? extends Product > >类型的变量,那就可以了。

规则如下:

List< ? extends Session< ? extends Product > >

所以:

( ∀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

但:

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

然而,从[1]和[3]我们得到:

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

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

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