2010-12-15 156 views
11

我想提供這樣的事情在我的API:嵌套泛型泛型類

class Foobar extends AbstractThing<Double> 

class EventThing<Foobar> {  
      public Foobar getSource(); 
      public Double getValue(); 
} 

所以我寫這篇文章:

class EventThing<T extends AbstractThing<U>> {  
     public T getSource(); 
     public U getValue(); 
} 

但Java無法解決U

使用EventThing<T extends AbstractThing<U>,U>代替它可以工作,但第二個U實際上是多餘的,因爲AbtractThing已經定義了類型。所以我喜歡擺脫它。

回答

26

你不能擺脫它。第二個U不是多餘的。您希望編譯器將第一個U解釋爲類型參數,但不是。你還可以這樣寫的:

class EventThing<T extends AbstractThing<Double>> 

注意Double在這種情況下,是一個具體的類,而不是一個類型參數。請將其與以下內容進行比較:

class EventThing<T extends AbstractThing<U>> 

請注意,這與上面第一行代碼的形式完全相同。編譯器應該如何知道在第一種情況下,Double是指具體類,而在第二種情況下,U是指類型參數?

編譯器無法知道該問題,並將U視爲具體類,就像第一行中的Double一樣。讓編譯器的唯一途徑知道U是一個類型參數是指定它是這樣:

class EventThing<T extends AbstractThing<U>, U> 
+1

在我看來,更像是編譯器的功能缺失。 編輯: 但我明白你的意思,謝謝你的回答。 要壞。我想我會離開這個洞的功能。 – 2010-12-15 16:31:32

+4

@Marcel:我認爲這個答案很清楚地解釋了爲什麼編譯器不能(也不應該)試圖猜測'U'是一個實際類型還是一個泛型類型參數。 Java要求每個泛型類型參數都有明確的聲明。不管你看起來如何,這不是「編譯器缺少的功能」。 – ColinD 2010-12-15 17:10:06

+1

@ColinD:我同意Marcel的看法,它確實看起來像是一個缺失的特徵,在他的例子中U看起來多餘。顯然,編譯器必須被告知U是一個類型參數,我們可以有這樣的類:class EventThing >,本質上是說:U是一個變量類型參數,現在自己去推斷它(使用字符%僅供討論之用,我同意這很醜陋)。這樣在調用代碼中就不會有重複。 – Gilead 2012-11-28 11:48:39