Java定义来自超类的协变返回

Java定义来自超类的协变返回,java,generics,covariance,Java,Generics,Covariance,我有以下抽象类: public abstract class AbstractSharpCollection<T> implements SharpCollection<T> 公共抽象类AbstractSharpCollection实现SharpCollection 和一个接口 public interface SharpCollection<T> extends Iterable<T> { SharpCollection<T&g

我有以下抽象类:

public abstract class AbstractSharpCollection<T> implements SharpCollection<T>
公共抽象类AbstractSharpCollection实现SharpCollection
和一个接口

public interface SharpCollection<T> extends Iterable<T>
{
    SharpCollection<T> tail();
}
公共接口SharpCollection扩展了Iterable
{
尖尾();
}
SharpCollection中定义了许多其他方法,它们返回另一个SharpCollection。所有这些方法的逻辑都只依赖于迭代器

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

差不多

public <V extends SharpCollection<T>> V tail() { //code logic here }
public V tail(){//code logic here}
我知道我可以重写扩展AbstractSharpCollection的子类上的返回类型,但是必须重写所有方法才能更改返回类型,这真的很难看,很麻烦,而且容易出错

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


谢谢您的帮助。

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

您似乎需要参数化
SharpCollection
,以便它“知道”正在使用的实际接口类型:

public interface SharpCollection<
    THIS extends SharpCollection<THIS, T>,
    T
> extends Iterable<T> {
    THIS tail();
}
公共接口集合<
这扩展了SharpCollection,
T
>可扩展的{
这条尾巴();
}

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

嗨,你能给我讲讲你的解决方案吗?别安静,明白了。或者提供指向它的帮助链接。:)谢谢。实际上,我正在使用这个解决方案来解决尾部问题,但它并不能解决所有情况,而且子类必须声明两个参数类型,而它应该只有一个。@Aman有关实现此模式的详细信息,请参见我的回答: