[英]Java Generics difference between T and ? extends T
有用。
方法声明
<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)
这是正在发生的事情:您使用通配符类型的实际参数调用start()
? extends Product
? extends Product
,所以编译器推断出这种类型,在CAP#2
等捕获变量中替换?
,为T
中的召唤开始。 因此,出现的类型是List< Session< CAP#2 > >
类型,我们所知道的是CAP#2 is-a Product
。
您是否尝试将该结果分配给List< Session< ? extends Product > >
类型的变量List< Session< ? extends Product > >
List< Session< ? extends Product > >
,它代表了一个异构的Sessions列表。 我打赌你把它分配给List< ? extends Session< ? extends Product > >
的变量List< ? extends Session< ? extends Product > >
List< ? extends 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
,从[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
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.