Java接口与返回被调用对象的方法?

时间:2011-04-04 19:17:48

标签: java generics

  

可能重复:
  Is there a way to say “method returns this” in Java?

我想用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();
    }
}

我不想放弃。

思想?

3 个答案:

答案 0 :(得分:3)

那是不可能的。最好的做法是将类型声明为接口本身。

interface I {
    I doSomething();
} 

这只是强制实现者返回具体类型,但它至少使实现者能够返回具体类型。您只需要在方法的javadoc上正确记录。

另请参阅java.lang.Appendable intercace StringBuilder以及实现构建器模式的所有其他类在标准Java SE API中执行的操作。

答案 1 :(得分:1)

  

我尝试过这样的事情:

这是规范的解决方案,在C ++中称为CRTP(奇怪的重复模板模式)。

但是,没有办法禁止B implements I<A>代码。所以你基本上没有运气了。

答案 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();
    }
}