如何在Java中使用接受扩展接口类型的参数的函数来创建接口?以接口ISelfComparable为例如果A类扩展了它,那么我希望它能够实现

bool compareTo(A other)
但是如果B类扩展了它,那么我希望它能够实现
bool compareTo(B other)
我知道我可以使用通用接口,但似乎不正确,因为A扩展ISelfComparable 毫无意义如果这不可能,那么在这种情况下的最佳实践是什么?

最佳答案

常见的解决方案是自绑定泛型,如在Enum类中所示。

interface Example<T extends Example<T>> {
    void foo(T t);
}

public class ExampleImpl implements Example<ExampleImpl> {
    @Override
    public void foo(ExampleImpl example) {
    }
}
它的工作方式有点令人头晕,但例如here的解释很好。关于主题here的答案也非常好。请注意,它并非万无一失,因为它允许这样做:
public class ExampleImpl2 extends Example<ExampleImpl {
    @Override
    public void foo(ExampleImpl example) {

    }
}
但是在实践中,自我约束的习语用于精确表达您所追求的事情。如果确实需要参数对象始终与this完全相同,则必须进行运行时检查。 (这也提出了一个问题,为什么您需要这个,但这将使我们偏离主题。)

09-19 15:34