【问题标题】:Lambda expression fails with LambdaConversionException when classes implements the same interfaces? [duplicate]当类实现相同的接口时,Lambda 表达式失败并出现 LambdaConversionException? [复制]
【发布时间】:2018-02-28 13:45:18
【问题描述】:

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

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();
        }
    }
}

【问题讨论】:

  • @Holger 先生,谢谢您将问题标记为重复。好工作。我找了一会儿,但找不到足够的答案。

标签: java java-8


【解决方案1】:

对于this JDK bug这个特定的实例,需要注意的是,在Collector之后声明接口Marker不会失败

失败:

interface Marker {}

interface Collector {
    IntStream stream();
}

通过:

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

【讨论】:

  • 感谢您的解释!
  • 对于这个具体的例子,编译器是否应该为流类型推断Stream&lt;Marker&amp;Collector&gt;Stream&lt;Collector&amp;Marker&gt;是未指定的,所以如果这个决定取决于接口声明的顺序并没有错,因为它无论如何都应该不重要,但是当然,如​​果这两种可能性之一触发了这个错误,它确实会有所作为。
猜你喜欢
  • 2017-03-09
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 2023-03-28
  • 2019-04-08
  • 1970-01-01
  • 2016-10-07
  • 2015-03-08
相关资源
最近更新 更多