java - 为什么这段代码只有在向类添加未使用的泛型类型参数后才能通过编译?

标签 java generics type-parameter

此代码未通过编译:

class SomeClass {
    void doSomethink(List<Integer> params) { }
}

class AnotherClass {
    public void method() {
        SomeClass someClass = new SomeClass();
        List<Long> list = new ArrayList<>();

        someClass.doSomethink(list);
    }
}

但是如果 SomeClass 包含未使用的类型参数 E 那么此代码将成功通过编译:

class SomeClass<E> {
    void doSomethink(List<Integer> params) { }
}

class AnotherClass {
    public void method() {
        SomeClass someClass = new SomeClass();
        List<Long> list = new ArrayList<>();

        someClass.doSomethink(list);
    }
}

为什么这会产生影响?未使用 E

最佳答案

您正在尝试传递 List<Long>到一个需要 List<Integer> 的方法。一个List<Long>不是 List<Integer> 的子类,所以这是不允许的。

当您创建SomeClass时类泛型(通过添加 E ),然后使用原始类型 SomeClass 实例化它,所有方法的所有泛型类型参数及其参数都被删除,并且编译器允许您传递任何 ListdoSomethink()方法。

请注意,如果将第二个代码段更改为(即不使用原始 SomeClass 类型),您将在第二个代码段中遇到相同的编译错误:

class SomeClass<E> {
    void doSomethink(List<Integer> params) { }
}

class AnotherClass {
    public void method() {
        SomeClass<Integer> someClass = new SomeClass<>();
        List<Long> list = new ArrayList<>();

        someClass.doSomethink(list);
    }
}

关于java - 为什么这段代码只有在向类添加未使用的泛型类型参数后才能通过编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50854619/

相关文章:

Java 泛型 : compilation failure using captures

Scala:通配符(类型参数)和集合的编译错误: "you may wish to investigate a wildcard type as"

haskell - 类型同义词/内部类型参数的类型同义词中的模式匹配

java - 当您在生产环境中测试和运行 jar 时,如何创建可用的 MANIFEST.MF?

java - 根据第一个 JComboBox 的选择使第二个 JCombobox 可见

C#改进算法

c# - Moq 使用匿名类型参数验证

java - 在 BouncycaSTLe 证书请求上添加 KeyUsage 扩展

java - twoSum 算法 : How to improve this?

java - 变量类型(通用或非通用)更改属性行为