为什么这段代码只有在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);
}
}
这段代码没有通过编译:
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);
}
}