Java 当类实现相同的接口时,Lambda表达式与LambdaConversionException一起失败?
我很惊讶,为什么lambda表达式不能在运行时正确调用。这是类型推断错误吗? work aournd示例是取消显式类型参数声明的注释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
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 {}