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>()
?这个问题的答案解决了它。
最佳答案
在第一种情况下,您使用的是原始类型 New
(而不是 New<Integer, String>
)因此所有通用类型检查都被禁用。这作为旧(Java 1.4)代码的兼容模式。
关于java - 参数化类与参数化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16791308/