首页 > 解决方案 > 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>,但是它是错误的。现在我完全不知道我应该写什么。

标签: javagenericsbounded-wildcard

解决方案


...我的函数想要自己接受,并吐出一些其他实现 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);
    }
}

推荐阅读