gpt4 book ai didi

java - 在方法签名保持不变但通用参数不同的情况下,方法覆盖如何工作?

转载 作者:行者123 更新时间:2023-11-30 09:40:15 26 4
gpt4 key购买 nike

我正在尝试以下示例:

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()子方法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);
}
}

我收到编译错误。它说“名称冲突:SubClass 类型的方法 methodA(Class) 与 BaseClass 类型的 methodA(Class) 具有相同的删除,但不会覆盖它”。

这是为什么?

最佳答案

参数化类型Class<?>是原始类型的子类型 Class4.10.2 )。

因此对于任何 x来电s.methodA(x)如果重写,第一个示例中的内容也将有效:

((BaseClass)s).methodA(x)

第二个例子不是这样。

想象 x类型 Class这不是 Class<?> 的子类型.那个电话将是非法的,因为参数的类型不是形式参数类型的子类型。

这意味着methodASubClass不会覆盖 methodABaseClass .

关于java - 在方法签名保持不变但通用参数不同的情况下,方法覆盖如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9500459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com