2

我有以下抽象类:

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 的子类上重写返回类型,但是必须重写所有方法只是为了更改返回类型真的很丑陋、麻烦并且容易出错。

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

谢谢您的帮助。

4

1 回答 1

2

Implementing tail would be quite difficult. null is the only valid return value.

It appears you need to parameterise the SharpCollection so that it "knows" the actual interface type being used:

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

Unfortunately this complicates the client code as well.

于 2012-08-16T15:22:15.113 回答