Java Lambda"循环推理"

时间:2016-05-13 18:27:34

标签: java lambda either

我不确定这里发生了什么,但是Java编译器似乎无法推断出我使用的这个lambda的类型(并且IntelliJ给了我一个"循环推理"警告)。它所抱怨的lambda是具有以下签名的函数的第一个参数:

public <T> T apply(Function<byte[], T> ifPrimitive, Function<List<TreeNode>, T> ifConstructed)

这是我如何使用它的一个例子:

value.apply((p) -> { return null; },
            (c) -> {
                // Process the object a bit and return some data
            }
);

以及编译错误:

error: method apply in class TreeValue cannot be applied to given types;
        value.apply((p) -> { return null; },
             ^
  required: Function<byte[],T>,Function<List<TreeObject>,T>
  found: (p)->{ ret[...]ll; },(c)->{ for[...]} } }
  reason: cannot infer type-variable(s) T
    (argument mismatch; bad return type in lambda expression missing return value)
  where T is a type-variable:
    T extends Object declared in method <T>apply(Function<byte[],T>,Function<List<TreeObject>,T>)
1 error
:compileJava FAILED

对于某些上下文,我尝试实现一个树,其中每个节点都是一个内部节点,包含更多节点或包含要处理的原始数据。我试图通过一种Either monad的实现来实现它,其中left选项是包含leaf的二进制数据的byte [],而右选项是子节点的列表。

我理解更为标准的方法可能是多态树,但由于这棵树将被其他类消费的方式,我觉得这不适用于此。

关于这里发生了什么的任何想法?

0 个答案:

没有答案