1
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()和 new之间有什么区别HashMap<Object, Object>()?这个问题的答案解决了它。

4

2 回答 2

2

在第一种情况下,您使用的是原始类型New(而不是New<Integer, String>),因此禁用了所有通用类型检查。这可作为旧 (Java 1.4) 代码的兼容模式。

于 2013-05-28T12:01:50.060 回答
0

如果您不指定类型参数,那么与 Java 1.4 的向后兼容性将假定您需要“Object”。此外,您将收到有关此的警告。

所以你的功能相当于:

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>

于 2013-05-28T12:55:44.403 回答