[英]How can i make an interface in java with a function that accepts a parameter of the type that extends the interface?
我如何在java中使用一个接受扩展接口类型的参数的函数来创建接口?
以接口 ISelfComparable 为例
如果 A 类扩展它,那么我希望它能够实现
bool compareTo(A other)
但如果 B 类扩展它,那么我希望它能够实现
bool compareTo(B other)
我知道我可以使用通用接口,但它似乎不正确,因为 A 扩展 ISelfComparable<B> 没有任何意义
如果这是不可能的,在这种情况下的最佳做法是什么?
通常的解决方案是自有界泛型,如Enum
类中所示。
interface Example<T extends Example<T>> {
void foo(T t);
}
public class ExampleImpl implements Example<ExampleImpl> {
@Override
public void foo(ExampleImpl example) {
}
}
它的工作原理有点令人眼花缭乱,但例如在这里解释得很好。 也有关于这个问题的一个很好的答案在这里。
请注意,它不是万无一失的,因为它允许:
public class ExampleImpl2 extends Example<ExampleImpl {
@Override
public void foo(ExampleImpl example) {
}
}
但在实践中,self-bounded 成语用于准确表达您所追求的事物。
如果您真的,真的,真的需要参数对象始终与this
完全相同,则必须进行运行时检查。 (它还提出了为什么你需要这个的问题,但这会让我们偏离主题。)
看看类java.lang.Comparable
:它有一个参数,可以使用 int compareTo
的对象类型。
类推:
public interface ISelfComparable<T extends ISelfComparable<T>> {
boolean compareTo(T other);
}
有一种方法可以检查参数的类型,但只能在运行时进行。 例如,您可以在默认方法中实现类型检查:
interface ISelfComparable {
default boolean compareTo(ISelfComparable param) {
if (this.getClass() != param.getClass()) {
throw new IllegalArgumentException();
}
...
}
}
那么这个接口的每个实现应该是这样的:
class A implements ISelfComparable {
@Override
public boolean compareTo(ISelfComparable param) {
ISelfComparable.super.compareTo(param);
...
}
}
在这种情况下,如果您调用new A().compareTo(new B());
然后会抛出java.lang.IllegalArgumentException
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.