作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
类似Comparable<>
的接口(interface)使用泛型来确定一个类可以与哪种类型进行比较。在某些情况下,将一个类与另一个类进行比较可能是有意义的,例如 A implements Comparable<B>
.但是我现在正在处理一种情况,我希望接口(interface)指定返回类型始终与实现接口(interface)的类型相同。也就是说A.get()
的类型应始终为 A
.
我最初强制自引用的尝试是这样的:
interface Property<T extends Property<T>> {
public T get();
}
这允许
class A implements Property<A> {
public A get() { ... }
}
同时防止类似的事情
class A implements Property<B> {
public B get() { ... }
}
不幸的是,它允许编译以下内容:
class A implements Property<A> {
public A get() { ... }
}
class B implements Property<A> {
public A get() { ... }
}
有办法吗?
最佳答案
不,没有办法强制子类根据 Curiously Recurring Template Pattern 的泛型类型参数缩小继承方法的返回类型。 .您不能强制 B
让 get()
返回 B
。子类可以在不改变方法的情况下继承方法,这是一个面向对象的原则。
有时我希望有这个功能——一种通用的“与 self 的关系”类型。这是我的语法。关键字“this”将表示此类型 - A
中的 A
,B
中的 B
。
public class A {
public this get() {
return this; // Or another instance of this type
}
}
public class B extends A {
// "this" on get in A forces B to override "get"
// to narrow the return type
@Override
public this get() {
return this;
}
}
但是强制 B
覆盖 getA()
违背了面向对象的原则。子类应该可以按原样自由地从父类(super class)继承方法。
关于java - 为什么没有办法让接口(interface)要求实现类来引用它们自己的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35587188/
我是一名优秀的程序员,十分优秀!