gpt4 book ai didi

java - 在 Java 中调用逆变方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:54:57 26 4
gpt4 key购买 nike

给定如下情况:

interface Base { }
interface Derived extends Base{ }
interface OtherDerived extends Base{ }

class A {
void implementation(Derived stuff) {
// Implementation A
}
}

class B extends A {
// contravariant; does not override
void implementation(Base stuff) {
// Implementation B
}
}

此代码中的方法调用是这样分派(dispatch)的:

(new B()).implementation(derivedObject);  // Ex. 1: calls A.implementation
(new B()).implementation(baseObject); // Ex. 1: calls B.implementation
(new B()).implementation(otherDerivedObject()); // Ex. 2: calls B.implementation

我一直想知道的是,为什么 Java 本质上将逆变方法(B.implementation)视为重载(除了 A.implementation 和 B.implementation 的签名不是重载等效的)。分派(dispatch)到最具体的方法签名是否有故意的原因(如果是这样,你能指出 Java 规范中明确说明的地方吗?),或者这只是 Java 中如何实现重写的偶然结果?

最佳答案

Java 继承其父类的所有方法,除非它们已被覆盖或隐藏。这意味着您的 B 类与

相同
class A {
void implementation(Derived stuff) {
// Implementation A
}
}

class B extends A {
// contravariant; does not override
void implementation(Base stuff) {
// Implementation B
}

void implementation(Derived stuff) {
super.implementation(stuff);
}
}

这样做的好处是说你有

class A {
void implementation(Derived stuff) {
// Implementation A
}
}

class B extends A {
}

new B().implementation(new Derived());

如果您稍后向 B 添加方法以提供向后兼容性,此编译代码不会改变其行为。

关于java - 在 Java 中调用逆变方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35385716/

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