为什么这段代码只有在class中添加了一个未使用的泛型类型参数后才能通过编译?

Why does this code only pass compilation after adding an unused generic type parameter to the class?

这段代码没有通过编译:

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> 的子 class,因此不允许。

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

请注意,如果将第二个代码段更改为(即不使用原始 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);
    }
}