Java泛型推理太宽泛?

标签 java generics recursion lambda type-inference

我有两门课:

class M {
    public <R, A, T extends A> A walk(BiFunction<Widget, Integer, Stream<R>> walker, BiFunction<A, Stream<R>, T> accF, A acc, int level) {
        return accF.apply(acc, walker.apply(this, level));
    }
}

class N extends M {

    public Stream<M> getChildren() {return Stream.of(new M()...);}

    @Override
    public <RR, A, T extends A> T walk(BiFunction<Widget, Integer, Stream<RR>> walker, BiFunction<A, Stream<RR>, T> accF, A acc, int level) {
        return accF.apply(accF.apply(acc, walker.apply(this, level)), getChildren().map(o -> o.walk(walker, accF, acc, level + 1)));
    }
}

但是,编译器在 o.walk(walker, accF, acc, level + 1) 中表示,推断变量 T 具有不兼容的边界:等式约束:T 上限:A,对象,RR

为什么会这样以及如何解决这个问题?

最佳答案

这是一些非常复杂的代码,我没有时间真正考虑它,但自从 getChildren()返回任何 MN#walk使用编译器自己的通用定义,例如A对于 child 来说可能是具有不同边界的不同类型,并且 walk

您可能会尝试将通用定义放在类级别,例如

class M <R, A, T extends A> { 
  public  A walk(...) { ... }
}

class N <RR, A, T extends A> extends M< RR, A, T> { 
  public Stream<M<RR, A, T>> getChildren() {...}
  public  A walk(...) { ... }
}

关于Java泛型推理太宽泛?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37658020/

相关文章:

java - 通过 GAE 进行 http 请求时,GAE 是否缓存数据?

java - 使用 Java 和 CQLSSTableWriter 将大行数据加载到 Cassandra 中

javascript - 带有 Java 后端的 meanJS

generics - typescript promise 泛型类型

c++ - 很难从我的二叉搜索树中删除一个节点

java - X500Principal Distinguished Name 命令

java - 在映射中强制执行泛型(与键/值泛型相关)

java - 更好的替代方法是使用 Void 作为可选参数

c - 中点集成优化

javascript - JavaScript中的递归: don't quite understand