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的这一章中,对您描述的问题进行了讨论。

此答案解释了可能重复的问题