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有关实现此模式的详细信息,请参见我的回答: