我想用Java定义一个接口,该接口的返回类型定义为实现对象的类型。
interface I {
TYPE doSomething();
}
class A implements I {
@Override A doSomething() {
return this;
}
}
class B implements I {
@Override B doSomething() {
return this;
}
}
等。 TYPE应该是什么?我尝试过这样的事情:
interface I<T extends I<T>> {
T doSomething();
}
class A implements I<A> {
@Override A doSomething() {
return this;
}
}
但是你可以做一些像
这样的事情class B implements I<A> {
@Override A doSomething() {
return new A();
}
}
我不想放弃。
思想?
答案 0 :(得分:3)
那是不可能的。最好的做法是将类型声明为接口本身。
interface I {
I doSomething();
}
这只是强制实现者返回具体类型,但它至少使实现者能够返回具体类型。您只需要在方法的javadoc上正确记录。
另请参阅java.lang.Appendable
intercace StringBuilder
以及实现构建器模式的所有其他类在标准Java SE API中执行的操作。
答案 1 :(得分:1)
答案 2 :(得分:1)
不,没有办法根据当前的类进行绑定检查。我想到的可能的替代方案是:
public interface I<T extends I> {
public T doSomething();
}
public class A implements I<A> {
@Override
public A doSomething() {
return new A();
}
}
public class B implements I<B> {
@Override
public B doSomething() {
return new B();
}
}