簡體   English   中英

Java泛型與T和?的區別?延伸T.

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM