2012-02-24 21 views
0

我似乎把自己塗在了一個泛型的角落裏。基本上我有一個通用接口X<T1, T2 extends Y<?, ?>>與一堆方法,包括T1 getFirstClass()T2 getSecondClass()。這對大多數事情都很好,但我需要做的一件事是找到這個類的實例,它們是我正在查找的超類,並且我需要一個「全部捕獲」對象找不到。這意味着我最終看起來像一個類:有什麼方法可以創建/獲取並返回一個類<T<?, ?>>對象?

public class A implements X<Object, Y<?, ?>> { 
    ... 
    public Class<Y<?, ?>> getSecondClass() { 
     return ???? 
    } 
} 

我試着用這個對付無視<?, ?>位和使用@SuppressWarnings("rawtypes"),它在Eclipse的作品,但是當螞蟻建造,提供錯誤消息type parameter Y is not within its bound。 JDK 應該是相同的 - 我只知道我的系統上安裝了一個,即1.6.0_23(由於超出我的控制範圍的因素,我不幸無法更新)。

有沒有什麼辦法可以解決這個問題還是我將不得不回到繪圖板和重新設計我的課?

+0

這對我來說似乎是一個非常複雜的設計。另外我不認爲你可以在類或方法聲明中使用通配符。在Java 7中改變了嗎? – 2012-02-24 09:41:54

+0

關於您的主要問題,由於類型擦除,您不能在運行時返回所需的泛型類。然而,你可以通過在構造函數中傳遞一個令牌類型來解決某些問題。 – 2012-02-24 09:46:20

+0

我知道類型擦除,我不在乎。泛型只在編譯時纔有類型安全性,並且可以爲我節省數十個演員,同時減少出錯的可能性。你是什​​麼意思在構造函數中傳遞一個標記類型?哦,史密斯先生 - 你絕對可以在類和方法聲明中使用通配符,它​​可以在同一個項目中的其他類的負載中正常工作。 – Thor84no 2012-02-24 10:12:29

回答

1

很明顯 - 由於擦除 - 每個類聲明只有一個Class對象Y.classY<F1, ..., FN>。此對象的類型是Class<Y>,Y是原始類型。通過它作爲一個Class<Y<A1, ..., AN>你需要上溯造型,然後垂頭喪氣:

return (Class<Y<?, ?>>)(Object) Y.class; 

你可以找到相關的JLS引用在以前answer到類似的問題。

+0

這就是我要找的。謝謝!這感覺就像是一個黑客,但如果它讓代碼的其餘部分更具可讀性,那可能是值得的。 – Thor84no 2012-02-24 14:24:34

相關問題