Java 在方法签名保持不变但泛型参数不同的情况下,该方法是如何工作的?
我正在尝试以下示例:Java 在方法签名保持不变但泛型参数不同的情况下,该方法是如何工作的?,java,generics,overriding,Java,Generics,Overriding,我正在尝试以下示例: class BaseClass { public void methodA(Class<?> cl) { System.out.println("Base.methodA()"); } } class SubClass extends BaseClass { public void methodA(Class cl) { System.out.println("Sub.methodA()"); }
class BaseClass {
public void methodA(Class<?> cl) {
System.out.println("Base.methodA()");
}
}
class SubClass extends BaseClass {
public void methodA(Class cl) {
System.out.println("Sub.methodA()");
}
}
public class OverrideEx {
public static void main(String[] args) {
BaseClass b = new BaseClass();
BaseClass s = new SubClass();
b.methodA(Class.class);
s.methodA(Class.class);
}
}
类基类{
公共无效方法A(类别cl){
System.out.println(“Base.methodA()”);
}
}
类子类扩展了基类{
公共无效方法A(类别cl){
System.out.println(“Sub.methodA()”);
}
}
公共类重写{
公共静态void main(字符串[]args){
BaseClass b=新的BaseClass();
BaseClass=新的子类();
b、 方法A(类、类);
s、 方法A(类、类);
}
}
输出:
Base.methodA()
附属方法a()
但如果我改变骑行方法,则如下所示:
class BaseClass {
public void methodA(Class cl) {
System.out.println("Base.methodA()");
}
}
class SubClass extends BaseClass {
public void methodA(Class<?> cl) {
System.out.println("Sub.methodA()");
}
}
public class OverrideEx {
public static void main(String[] args) {
BaseClass b = new BaseClass();
BaseClass s = new SubClass();
b.methodA(Class.class);
s.methodA(Class.class);
}
}
类基类{
公共无效方法A(类别cl){
System.out.println(“Base.methodA()”);
}
}
类子类扩展了基类{
公共无效方法A(类别cl){
System.out.println(“Sub.methodA()”);
}
}
公共类重写{
公共静态void main(字符串[]args){
BaseClass b=新的BaseClass();
BaseClass=新的子类();
b、 方法A(类、类);
s、 方法A(类、类);
}
}
我发现编译错误。它说“名称冲突:SubClass类型的methodA(类)方法与BaseClass类型的methodA(类)方法具有相同的擦除,但不覆盖它”
为什么会这样?参数化类型
类
是原始类型类
(§)的一个子类型
因此,对于任何x
而言,如果重写,则第一个示例中的调用s.methodA(x)
也将有效:
((BaseClass)s).methodA(x)
第二个例子并非如此
设想x
属于Class
类型,而不是Class
的子类型。那个电话
将是非法的,因为参数的类型不是形式参数类型的子类型
这意味着子类
的方法a
不会覆盖基类
的方法a
,根据,您可以覆盖方法,如果(除其他事项外):m1的签名是m2签名的子签名(§8.4.2)
这意味着():-m2与m1具有相同的签名,或
-m1的签名与m2签名的擦除相同
在尝试重写
方法A
时,您具有相同类型的擦除,但没有相同的签名。在jls的这一章中,对您描述的问题进行了讨论。此答案解释了可能重复的问题