在scjp准备的书中,我读过以下内容:
Keep the following points in mind for correct overriding. The overriding method
1. Should have the same argument list types (or compatible types) as
the base version.
...
您能提供compatible types
个参数的示例吗?
class Parent {
public void m(Number n){}
}
class Child extends Parent {
@Override
public void m(/*what can i write here?*/){
}
}
答案 0 :(得分:1)
“兼容类型”的一个例子:
class C1 {
public void m1 (List<Integer> l) {}
}
class C2 extends C1 {
@Override
public void m1 (List l) {} // legal, this overrides
}
基本上,参数列表可以具有“兼容”类型而没有完全相同类型的唯一方法是,重写方法的参数与被覆盖的方法的参数相同,并删除所有类型参数。
规则在JLS§8.4.8.1(SE8)中进行了解释,该规则表明重写方法的签名必须是被覆盖的方法的子签名;在引用之后,我们发现这意味着“subsignature”意味着它是相同的签名或被覆盖的签名的类型擦除。
(P.S。当然,你不应该这样做。在现实生活中,重写方法应该有相同的参数类型,句号。)
(PPS。请注意,兼容性只有一种方式。这不合法:)
class C1 {
public void m1 (List l) {}
}
class C2 extends C1 {
@Override
public void m1 (List<Integer> l) {} // illegal
}
答案 1 :(得分:1)
这是定义from JLS
在类C中声明的实例方法m1会覆盖另一个实例 方法m2,在A类中声明如果满足以下所有条件:
C是A的子类。
m1的签名是m2签名的子签名(§8.4.2)。
或者:
m2是公共,受保护或声明的默认访问权限 打包为C,或
m1覆盖方法m3(m3与m1不同,m3与m2不同), 这样m3就会覆盖m2。
此外,如果m1不是抽象的,则说m1实现任何和 它覆盖的所有抽象方法声明。
方法m1的签名是a的签名的子签名 方法m2如果:
m2与m1具有相同的签名,或
m1的签名与签名的擦除(§4.6)相同 m2。
如果是m1,则两个方法签名m1和m2是覆盖等效的 是m2或m2的子签名是m1的子签名。
Collection
(原始类型)和Collection<String>
,因为在类型删除后它们是相同的