Java定义超类的协变返回

时间:2012-08-16 15:11:21

标签: java generics covariance

我有以下抽象类:

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的子类的返回类型,但是只是为了更改返回类型而重写所有方法实际上是非常丑陋,麻烦且容易出错。

有什么方法可以实现我想要的目标吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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

您似乎需要对SharpCollection进行参数设置,以便它“知道”所使用的实际接口类型:

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

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