子类型化和泛型函数<?超级T ,?扩展了Java中的T>

时间:2020-11-06 16:56:11

标签: java generics bounded-wildcard

我有一个接口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>,但是这是错误的。现在我完全不知道该写些什么。

1 个答案:

答案 0 :(得分:0)

...我的函数希望自己使用,并吐出一些其他实现A的项目

如果这是您的唯一要求,我们可以取消super子句。

  1. 您说过,该函数应将其当前实例作为输入。我们可以通过在interface A级别引入类型参数来实现它。
  2. 要返回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);
    }
}