2009-12-05 46 views
3

當我有這樣一個Java泛型函數:如何讓Java編譯器告訴我它推斷出哪種類型?

<T> T choose(T a, T b) { } 

,我把它從什麼地方,我怎麼能找到推斷什麼類型對於T?

編輯:類型推斷髮生在編譯時。所以我問的是,如何讓編譯器告訴我它在編譯期間有一些信息(推斷的類型),但是它不會將它放到.class文件中?

有一件事我可以做的就是儘量結果分配給不同類型的變量,例如:

// Compiles, so inferred type is at least Throwable. 
Throwable foo = choose(new EOFException(), new FileNotFoundException()); 

// If this compiles, T must be Map or something that implements Map. 
Map foo = choose(new HashMap(), new TreeMap()); 

但是,這是相當間接的。我希望編譯器告訴我它爲T所推斷的類型,而不是我必須播放20個問題。

回答

0

我希望類型推斷髮生在編譯階段(c.f. Scala),所以我對你的問題有點困惑。

Java在實現泛型時使用type erasure。請注意,類型推斷是proposed for Java 7,但是。

+1

如果你downvoting,您可以指定你不同意什麼,好嗎? – 2009-12-05 13:07:59

0

好吧,考慮到你的兩個例子,你不必期待特定類型的結果。 編譯器將最具體的通用類型作爲「T」,如果這個「類型」是一個接口,那麼你將有實現該接口的煩人類的實例(爲你的「富」對象)。

3

在eclipse中,將鼠標懸停在方法調用表達式上。 Eclipse將使用推斷的類型顯示簽名。

編輯:看來這的確是不總是正確的。對於下面的聲明

interface I {void foo();} 
class C {} 
class D extends C implements I { public void foo() {}} 
class E extends C implements I { public void foo() {}} 

和表達,

java.util.Arrays.asList(new D(), new E()).get(0).foo(); 

顯示推斷類型是? extends C,但實際推斷類型是? extends C & I,如明顯由允許訪問foo。我沒有線索,爲什麼Eclipse會顯示不同的類型其內置的編譯器推斷...

+0

這很完美,謝謝! – 2009-12-05 14:43:59

+1

經過多一點調查後,結果表明Eclipse給出了一個過於簡化的(即錯誤的)答案。如果我輸入的內容可能是多個事物(例如,示例中的兩個參數共享許多接口以及基類),Eclipse將選擇一個,甚至不是上下文中實際使用的那個。 – 2009-12-05 22:30:15

+0

有趣的是,事實確實如此。在我的回答中提供了一個測試用例來證明這一點。對不起,我似乎太信賴eclipse了。我會留下我的回答,以便其他人可以看到它爲什麼不起作用。 – meriton 2009-12-05 23:55:11

相關問題