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>();
}
}
此代码编译时没有错误。
然后,我们在New类中进行一些更改:
class New {
<K, V>Map<K, V> map(){
return new HashMap<K, V>();
}
}
我们只对方法map()
进行了参数化,而不是整个类。但在这种情况下,行f(c.map());
发生了编译错误:
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 是什么?这个问题的答案解决了它。
答案 0 :(得分:2)
在第一种情况下,您使用的是原始类型New
(而不是New<Integer, String>
),因此禁用所有通用类型检查。这适用于旧(Java 1.4)代码的兼容模式。
答案 1 :(得分:0)
如果未指定类型参数,则向后兼容Java 1.4将假定您需要“对象”。此外,您将收到有关此事的警告。
所以你的功能相当于:
public static void main(String[] args){
New c = new New();
f(c.<Object, Object>map());
}
然后您收到一条错误消息,说您正在尝试使用值Map<Object, Object>
,其中参数Map<Integer, String>
是预期的。
注意:Map<Integer, String>
不是Map<Object, Object>
的子类型。