2012-10-28 85 views
2

我看了其他類型轉換的Java泛型問題,我仍然感到困惑。嵌套類型的不可轉換類型

我有下面的類層次結構:WeightedThing<T>(只是增加了一個重一些隨機型)和一個自定義Vector類的WeightedVector(不,WeightedVector不僅僅是WeightedThing<Vector>)是一個子類。

我想做最近鄰居搜索,並返回給定查詢向量及其距離的最接近向量列表。對於這一點,我定義了一個search方法:

public List<WeightedThing<? extends Vector>> search(Vector, int limit) {...} 

希望我可以做

List<WeightedThing<WeightedVector>> neighbors = (List<WeightedThing<WeightedVector>>)search(query, 1); 

這不工作(的IntelliJ不將其標記爲錯誤,但Sun的jdk7u10編譯它Mac OS X失敗)。與Vector都沒有調用相同的功能。 我可以強制它通過添加一個upcast到Object進行編譯,但這看起來很可怕。

這樣做的目的是讓我可以搜索並添加任何類型的矢量,但如果我知道我只添加了WeightedVectors,我想將結果轉換回WeightedVectors。

+0

此內容是否有用? http://stackoverflow.com/questions/2522155/java-generics-parameters-with-base-of-the-generic-parameter – INS

+0

感謝您的建議,但不是真的,請參閱下面我對Ale E的回答的評論。 –

回答

0

WeightedThing<? extends Vector>列表與WeightedThing<WeightedVector>列表不一樣。要進行類型轉換,它會轉換爲any collection的野生字符類型,然後轉換爲特定類型。

List<WeightedThing<WeightedVector>> neighbors = (List<WeightedThing<WeightedVector>>) 
               (List<?>)search(query, 1); 
+0

對答案並不滿意,但更多的是因爲Java。 :) –

3

通常,在方法的返回類型中使用通配符類型並不是一個好習慣。爲什麼不嘗試更改方法簽名,如下所示:

public <T extends Vector> List<WeightedThing<T>> search(T vector, int limit) {...} 
+0

這將工作,除了我想要的是能夠調用'搜索'與'矢量',但回來'WeightedThing '的列表,因爲我加了'WeightedVector'時調用'加' 。我意識到這可能會導致無效的類型,但我想要的是編譯器相信我正在做正確的事情。 –