我有以下抽象类:

public abstract class AbstractSharpCollection<T> implements SharpCollection<T>


和一个界面

public interface SharpCollection<T> extends Iterable<T>
{
    SharpCollection<T> tail();
}


SharpCollection中定义了许多其他方法,这些方法返回另一个SharpCollection。所有这些方法的逻辑仅依赖于迭代器。

我希望能够在AbstractSharpCollection上创建一个方法,以便对tail()的调用将返回子类的实例,而不是超类的实例。

就像是

public <V extends SharpCollection<T>> V tail() { //code logic here }


我知道我可以在扩展AbstractSharpCollection的子类上覆盖返回类型,但是仅重写所有方法来更改返回类型确实很丑陋,麻烦且容易出错。

有什么办法可以实现我想要的?

谢谢您的帮助。

最佳答案

实现tail将会非常困难。 null是唯一有效的返回值。

看来您需要参数化SharpCollection,以便它“知道”所使用的实际接口类型:

public interface SharpCollection<
    THIS extends SharpCollection<THIS, T>,
    T
> extends Iterable<T> {
    THIS tail();
}


不幸的是,这也使客户端代码复杂化。

10-04 13:18