在 java 中使用类型擦除覆盖/重载方法
overriding / overloading methods with type erasure in java
与给定的 2 classes:
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 是一些通用的 class)。
我知道在类型擦除之后,classes 看起来像:
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;
}
}
在我知道类型擦除之前,我认为我确实理解为什么编译器将其视为重载。
但现在我(认为)我知道类型擦除,这两个方法签名是相同的,我真的认为编译器将其视为 OVERRIDING 更有意义。
编译后,发现 java 的编译器将其视为试图重载而不是覆盖,并在重载到相同签名的方法时产生错误。
我的问题:
为什么编译器仍然将此视为 OVERLOADING 而不是 OVERRIDING 的尝试,尽管在类型擦除之后签名是一样的?
谢谢!
这里的错误 "overloading with same signature" 似乎足够了。它在技术上不是压倒一切的,因为对编译器来说,泛型很重要,B 的 f 不满足 A 的签名,因为 A 的 f T 不限于实现 Cell<?>
,所以 B 的 f 不会压倒 A 的 f;将其称为 "overloading" 更有意义,因为从通用角度来看,这些签名是不同的,尽管在擦除后最终是相同的。
我认为 "overloading with same signature" 错误是针对此特定场景添加的,泛型导致擦除冲突。
与给定的 2 classes:
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 是一些通用的 class)。
我知道在类型擦除之后,classes 看起来像:
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;
}
}
在我知道类型擦除之前,我认为我确实理解为什么编译器将其视为重载。
但现在我(认为)我知道类型擦除,这两个方法签名是相同的,我真的认为编译器将其视为 OVERRIDING 更有意义。
编译后,发现 java 的编译器将其视为试图重载而不是覆盖,并在重载到相同签名的方法时产生错误。
我的问题: 为什么编译器仍然将此视为 OVERLOADING 而不是 OVERRIDING 的尝试,尽管在类型擦除之后签名是一样的?
谢谢!
这里的错误 "overloading with same signature" 似乎足够了。它在技术上不是压倒一切的,因为对编译器来说,泛型很重要,B 的 f 不满足 A 的签名,因为 A 的 f T 不限于实现 Cell<?>
,所以 B 的 f 不会压倒 A 的 f;将其称为 "overloading" 更有意义,因为从通用角度来看,这些签名是不同的,尽管在擦除后最终是相同的。
我认为 "overloading with same signature" 错误是针对此特定场景添加的,泛型导致擦除冲突。