为什么接口没有办法要求实现类来引用自己的类型?

时间:2016-02-23 20:09:19

标签: java generics

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() { ... }
}

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:3)

不,没有办法强制子类根据Curiously Recurring Template Pattern的泛型类型参数缩小继承方法的返回类型。您无法强制Bget()返回B。这是一个面向对象的原则,子类可以在不改变任何内容的情况下继承方法。

有时候我希望这个功能 - 与自我的通用关系&#34;类型。这是我如何获得语法。关键字&#34; this&#34;将代表此类型 - A中的AB中的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()违反了面向对象的原则。子类应该可以自由地从超类继承一个方法。