此代码未通过编译:
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
实例化它,所有方法的所有泛型类型参数及其参数都被删除,并且编译器允许您传递任何 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);
}
}
关于java - 为什么这段代码只有在向类添加未使用的泛型类型参数后才能通过编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50854619/