作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给定如下情况:
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/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!