像Comparable<>
这样的接口使用泛型来确定类可以与哪种类型相媲美。在某些情况下,将一个类别与另一个类别(例如A implements Comparable<B>
)相比可能是有意义的。但我现在处理的情况是,我希望接口指定返回类型始终与实现接口的类型相同。也就是说,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() { ... }
}
有办法做到这一点吗?
答案 0 :(得分:3)
不,没有办法强制子类根据Curiously Recurring Template Pattern的泛型类型参数缩小继承方法的返回类型。您无法强制B
让get()
返回B
。这是一个面向对象的原则,子类可以在不改变任何内容的情况下继承方法。
有时候我希望这个功能 - 与自我的通用关系&#34;类型。这是我如何获得语法。关键字&#34; this&#34;将代表此类型 - 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()
违反了面向对象的原则。子类应该可以自由地从超类继承一个方法。