我有一个接口A和一个实现A的类B。
我在A中有一个称为doX(Function<? super A, ? extends A> f)
的方法。当我尝试通过编写<T extends A> doX(Function<? super B, T> f)
在B中实现它时,它无法编译。我尝试了其他可能的泛型的变体也不起作用。基本上,我的函数希望自己使用,并吐出一些实现A的项目。通过使用PECS,它变成<? super B>
,但是这是错误的。现在我完全不知道该写些什么。
答案 0 :(得分:0)
...我的函数希望自己使用,并吐出一些其他实现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);
}
}