Java 当类实现相同的接口时,Lambda表达式与LambdaConversionException一起失败?

Java 当类实现相同的接口时,Lambda表达式与LambdaConversionException一起失败?,java,java-8,Java,Java 8,我很惊讶,为什么lambda表达式不能在运行时正确调用。这是类型推断错误吗? work aournd示例是取消显式类型参数声明的注释 public class LambdaConversionTest { @Test public void whyDidLambdaExpressionFailsWithLambdaConversionException() { try { // v--- when uncomment it, th

我很惊讶,为什么lambda表达式不能在运行时正确调用。这是类型推断错误吗? work 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();
        }
    }
}
公共类LambdaConversionTest{
@试验
public void whyDidLambdaExpressionFailsWithLambdaConversionException()的原因{
试一试{
//v---取消注释时,行为是我所期望的
流。/**/of(新机器人(),新拉拔器())
.flatMapToInt(收集器::流).sum();
失败(“因预期行为而失败”);
}捕获(BootstrapMethodError原因){
断言(why.getCause().getMessage())
,包含字符串(“无效接收器类型接口”);
}
}
接口标记{
}
接口采集器{
IntStream();
}
类Robot实现收集器、标记器{
@凌驾
公共IntStream(){
返回IntStream.empty();
}
}
类拉拔器实现收集器、标记器{
@凌驾
公共IntStream(){
返回IntStream.empty();
}
}
}

对于的此特定实例,应注意,如果在
收集器之后声明接口
标记
,则不会失败

失败:

通过:


@霍尔格先生,谢谢你把问题标记为重复。干得好我找到它有一段时间了,但是我找不到足够的答案。谢谢你的解释!对于这个特定的示例,编译器是否应该推断流类型的
Stream
Stream
,这是未指明的,因此,如果这个决定取决于接口声明的顺序,那么这并没有错,因为无论如何都不重要,但是如果这两种可能性中的一种触发了错误,这确实会有所不同。
interface Marker {}

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