为什么此代码仅在向类中添加未使用的泛型类型参数后才通过编译?

时间:2018-06-14 09:53:56

标签: 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);
    }
}

为什么这会有所不同? <{1}}未使用。

1 个答案:

答案 0 :(得分:3)

您正尝试将List<Long>传递给期望List<Integer>的方法。 List<Long>不是List<Integer>的子类,因此不允许。

当您使SomeClass类具有通用性(通过添加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);
    }
}