java - 参数化类与参数化方法

标签 java class parameterized

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/

相关文章:

constructor - Quartz.net IJobDetails 使用手动创建的 IJob 实现

java - 通过 STS eclipse 连接到 ClearCase(CCRC) 时出错

java - 设置由 Activity 链接的新页面

c# - 如何在自定义类中创建名称数组

c# 访问所有可用的 css 列表或属性集合

java - 获取通用类

java - 在java中运行脚本的有效方法

java - Selenium,Java - 无法定位元素

Java:一个类是它自己的子类吗?

java - 如何使用参数化数据的多个来源