2009-06-24 102 views
2

作爲隨訪至this question,第一背景爲什麼忽略參數類型時泛型完全禁用?

鑑於這一聲明一個類:

public class SomeClass<T> 

而且一個子類,不使用泛型參數:

public class SomeSubClass extends SomeClass 

的方法上SomeClass聲明如下:

protected Map<String, Object> getMap(Object param) { 
} 

如果調用子類這樣的方法:

Map<String, Object> val = getMap(param); 

編譯器在本質上抱怨的GetMap返回一個普通的地圖,並有一個未經檢查的分配給一個泛型化地圖。爲什麼會這樣?這是對泛型的文檔化的期望,是否有原因呢?

+0

您可以發佈確切異常,一個真正的代碼示例?很難確定你發佈的內容。 – 2009-06-24 19:46:50

+0

如果你看看鏈接的問題,你有一個真實的例子。 http://stackoverflow.com/questions/1039658/why-is-code-that-returns-a-genericized-map-generating-a-compiler-warning-when-ass – Yishai 2009-06-24 19:48:56

+2

相關問題與很好的解釋http:// stackoverflow .com/questions/449103 – 2009-06-24 20:39:04

回答

1

我不太知道這樣做的原因,但這種行爲是在Java Language Specification JLS S4.8規定:原始類型的

超類(分別爲超接口)是超類的擦除(超級)其任何參數化調用。

鑑於在新代碼中使用Raw類型非常不鼓勵,他們只是簡單地規定了原始類型和參數化類型之間的交互規則。

1

這是一個奇怪的。看來,雖然,你總是可以得到延長SomeClass<Object>,而不是SomeClass擺脫錯誤的,而不會引入任何問題:

public class SomeSubClass extends SomeClass<Object> { 
    ... 
} 
相關問題