public class ExplicitTypeSpecification {
static void f(Map<Integer, String> map){}
public static void main(String[] args){
New c = new New();
f(c.map());
}
}
class New <K, V>{
Map<K, V> map(){
return new HashMap<K, V>();
}
}
此代碼編譯時沒有錯誤。參數化類vs參數化方法
然後,我們在做新類的某些變化:
class New {
<K, V>Map<K, V> map(){
return new HashMap<K, V>();
}
}
我們只是參數的方法map()
,而不是整個類。但是,在這種情況下,編譯錯誤的行f(c.map());
occures:
java: f(java.util.Map<java.lang.Integer,java.lang.String>) in
Generics.ExplicitTypeSpecification.ExplicitTypeSpecification cannot be applied to
(java.util.Map<java.lang.Object,java.lang.Object>)*
我們可以指向明確的類型f(c.<Integer, String>map());
但我感興趣的是爲什麼我們得到一個編譯錯誤?。
在這兩種情況下,方法map()
都會返回Map<Object, Object>
對象,但在第一種情況下,我們只會收到未檢查分配的警告。
問題:爲什麼在第二種情況下我們有更嚴格的類型檢查?
什麼是new HashMap()
和HashMap<Object, Object>()
之間的dirrefence?回答這個問題解決了它。
有趣的發現,特別是因爲'Map map = c.map(); f(地圖);'編譯。我認爲這與編譯器猜測「K」和「V」的正確值的能力有關。 –
Cephalopod