此代码未通过编译:
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}}未使用。
答案 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);
}
}