它有效。
方法声明
<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)
答案 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 > >