【发布时间】:2023-12-27 10:28:01
【问题描述】:
以下代码:
class Parent {
public void method(List parameter){
}
}
class Child extends Parent {
public void method(List<String> parameter) {
}
}
编译失败,出现以下错误:
Parent.java:12: error: name *: method(List<String>) in Child and method(List) in Parent have the same erasure, yet neither overrides the other
public void method(List<String> parameter) {
^
1 error
但我正在检查第 8.4.8.1 节中的 JLS8 是否说:
在类 C 中声明或继承的实例方法 mC,覆盖 来自 C 类 A 中声明的另一个方法 mA,当且仅当满足以下所有条件时 是真的:
...
mC 的签名是 mA的签名。
...
在 §8.4.2 中它说:
如果满足以下任一条件,方法 m1 的签名是方法 m2 签名的子签名:
...
m1 的签名与 m2 签名的擦除(第 4.6 节)相同。
在这种情况下,原始方法声明和覆盖方法声明都具有相同的擦除,那么为什么编译会失败?
【问题讨论】:
-
List<String>不是List的擦除,因此根据您引用的规范,它不是子签名。我想你把m1和m2搞混了。 -
他们不是都被认为是类型擦除到
List<Object>吗?。 -
它们都被类型擦除为
List,但你引用的规范不是关于它们是否有共同的擦除,而是关于子类的方法是否是超类方法的擦除。如果父类有List<String>,子类有List,那就没问题了。 -
@4castle,我明白了,我的问题弄错了,我该怎么办?编辑问题?还是因为问题本身的表述不正确而将其删除?
标签: java overriding jls