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);
}
}