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

Java 为什么这段代码只在向类添加未使用的泛型类型参数后才通过编译?,java,generics,type-parameter,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<>(); someC

此代码未通过编译:

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

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

        someClass.doSomethink(list);
    }
}

为什么这会有不同<代码>E未使用。

您试图将
列表
传递给需要
列表
的方法。
列表
不是
列表
的子类,因此它是不允许的

当您将
SomeClass
类设置为泛型时(通过添加
E
),然后使用原始类型
SomeClass
对其进行实例化,所有方法的所有泛型类型参数及其参数都将被删除,编译器允许您将任何
列表
传递给
doSomethink()
方法

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

class-SomeClass{
void doSomethink(列表参数){}
}
另一类{
公开作废法(){
SomeClass SomeClass=新的SomeClass();
列表=新的ArrayList();
someClass.doSomethink(列表);
}
}

错误消息是怎么说的?捕捉得很好。我没有注意到他第二段代码中的原始类型。我不明白为什么在这种情况下所有泛型类型都会被删除,你能提供参考吗?@Alexandrahipov请参见和JLS 4.6
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);
    }
}
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);
    }
}