4

有用。

方法声明

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

1 回答 1

5

这是发生的事情:您start()使用通配符类型的实际参数进行调用? extends Product,因此编译器推断出该类型,并在调用开始时用捕获变量代替, for CAP#2。因此,出来的类型就是那种类型,我们所知道的就是那个类型。?TList< Session< CAP#2 > >CAP#2 is-a Product

您正在尝试将该结果分配给 type 的变量,该变量List< Session< ? extends Product > >表示 Sessions 的异构列表。我敢打赌,如果您将其分配给类型的变量,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,从 [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
)
于 2013-10-19T20:23:51.473 回答