Java 定义从父类(super class)返回的协变

标签 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() 的调用将返回子类的实例,而不是父类(super class)。

类似于

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

我知道我可以重写扩展 AbstractSharpCollection 的子类的返回类型,但必须重写所有方法只是为了更改返回类型,这确实很丑陋、麻烦且容易出错。

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

感谢您的帮助。

最佳答案

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

看来您需要参数化 SharpCollection 以便它“知道”正在使用的实际接口(interface)类型:

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

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

关于Java 定义从父类(super class)返回的协变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11990297/

相关文章:

c# - 无法转换通用对象

java - 有没有更好的方法来编写这个(集合)Helper类

java - 使用 deferredResult 时,无法在提交响应后转发

c# - 是否可以在 C# 泛型方法中定义 "not Nullable<T>"约束?

java - Java泛型方法的参数

python - 使用 pandas 找到矩阵中的负对

c# - 无效方差 : The type parameter must be invariantly valid but is covariant

java - 使用抽象方法设计通用API,但在传递给匿名类时必须使用final 变量。有更好的方法来实现这一点吗?

java - java中如何动态设置PreparedStatement?

c# - 将通用输入对象传递给方法 C#