如何在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
完全相同,则必须进行运行时检查。 (这也提出了一个问题,为什么您需要这个,但这将使我们偏离主题。)