java - Java中的子类型和泛型函数
问题描述
我有一个实现 A 的接口 A 和 B 类。
我在 A 中有一个方法,称为doX(Function<? super A, ? extends A> f)
. 当我尝试在 B 中通过编写来实现它时<T extends A> doX(Function<? super B, T> f)
,它不会编译。我尝试了其他可能的泛型的变体也不起作用。基本上,我的函数想要自己接受,并吐出一些其他实现 A 的项目。通过使用 PECS,它变成了<? super B>
,但是它是错误的。现在我完全不知道我应该写什么。
解决方案
...我的函数想要自己接受,并吐出一些其他实现 A 的项目
如果这是您唯一的要求,我们可以取消super
条款。
- 您说该函数应将其当前实例作为输入。我们可以通过在
interface A
级别引入类型参数来实现它。 - 为了返回另一个实现
interface A
,我们可以在方法级别引入一个类型参数。
下面是完整的代码
public class Subtyping {
private interface A<T extends A<T>> {
<S extends A<S>> S doX(Function<T, S> f);
}
private static class B implements A<B> {
@Override
public <S extends A<S>> S doX(Function<B, S> f) {
return f.apply(this);
}
}
private static class C implements A<C> {
@Override
public <S extends A<S>> S doX(Function<C, S> f) {
return null;
}
}
public static void main(String[] args) {
B b = new B();
C result = b.doX(v -> new C());
System.out.println(result);
}
}
推荐阅读
- swiftui - onTapGesture 和 onLongPressGesture 没有响应
- python - 在python的条形图中将名称放在条形图中
- javascript - 从Angular中的异步函数解析数据时的空白图表
- c++ - 在这种情况下,C++ 标准是否保证模板实例化点?
- javascript - Nginx 音频文件 (wav/ogg/mp3) 不工作
- c# - C#如何检查代理服务器是否工作?
- javascript - VueJS中对象的过滤值
- python - Python检查字典中的列表是否满足两个条件
- python - 在单个时代向前或向后传递或两者中真正发生了什么?
- javascript - 为什么取消选择不适用于可选择和可拖动的多个项目