当类实现相同的接口时,Lambda表达式因LambdaConversionException而失败? [重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当类实现相同的接口时,Lambda表达式因LambdaConversionException而失败? [重复]相关的知识,希望对你有一定的参考价值。

我很惊讶,为什么lambda表达式无法在运行时正确调用。这是一个类型推断错误?工作aournd示例取消注释显式类型参数声明。

public class LambdaConversionTest {
    @Test
    public void whyDidLambdaExpressionFailsWithLambdaConversionException() {
        try {
            //      v--- when uncomment it, the behavior is what I expected
            Stream./*<Collector>*/of(new Robot(), new Puller())
                  .flatMapToInt(Collector::stream).sum();
            fail("fails with expected behavior");
        } catch (BootstrapMethodError why) {
            assertThat(why.getCause().getMessage()
                 ,containsString("Invalid receiver type interface "));
        }
    }

    interface Marker {
    }

    interface Collector {
        IntStream stream();
    }

    class Robot implements Collector, Marker {
        @Override
        public IntStream stream() {
            return IntStream.empty();
        }
    }

    class Puller implements Collector, Marker {
        @Override
        public IntStream stream() {
            return IntStream.empty();
        }
    }
}
答案

对于这个特殊的this JDK bug实例,应该注意的是,如果你在Marker之后声明接口Collector它不会失败

失败:

interface Marker {}

interface Collector {
    IntStream stream();
}

通过:

interface Collector {
    IntStream stream();
}
interface Marker {}

以上是关于当类实现相同的接口时,Lambda表达式因LambdaConversionException而失败? [重复]的主要内容,如果未能解决你的问题,请参考以下文章

java中lambda表达式怎样实现一个多方法的接口呢

Lamb表达式匿名类实现接口方法

Java8新特性03 Lambda表达式

Java中Lambda表达式的使用

C#进阶 | 全面解析Lambda表达式

java8的新特性1