具有给定的2类:
public class A{
public <T> Cell<T> f(Cell<T> l){
return null;
}
}
public class B extends A{
public <T> Cell<T> f(Cell<Cell<T>> l){ // trying to override
return null;
}
}
(当Cell是某个通用类时)。
我了解在擦除类型后,这些类如下所示:
public class A{
public Cell f(Cell l){
return null;
}
}
public class B extends A{
public Cell f(Cell l){ // trying to override
return null;
}
}
在我知道类型擦除之前,我认为我确实理解了为什么编译器将其视为重载。
但是现在我(认为)我知道类型擦除,这两个方法签名是相同的,并且我真的认为编译器将其视为覆盖更为有意义。
编译后,得到了Java的编译器将其视为OVERLOAD(而不是覆盖)的尝试,并且在重载到相同签名的方法时产生错误。
我的问题: 为什么在类型擦除后,尽管签名完全相同,编译器仍将其视为重载而不是重载?
谢谢!
答案 0 :(得分:0)
此处出现错误“使用相同签名重载”似乎足够。从技术上讲,这不是最重要的,因为对于编译器泛型而言很重要,并且B的f不满足A的签名,因为A的f T不限于实现Cell<?>
,因此B的f不会取代A的f;取而代之的是将其称为“重载”,因为从通用角度来看,尽管在擦除后最终相同,但这些签名却是不同的。
我认为在这种特殊情况下使用泛型会导致“擦除相同签名”错误,这会导致擦除冲突。