Tag: 语言规范

为什么添加“.map(a – > a)”允许这个编译?

这与我对“流减少不兼容类型”的回答有关。 我不知道为什么我的建议有效,而霍尔格正确地向我施压。 但即使他似乎也没有清楚解释它为何起作用。 那么,让我们问它自己的问题: 以下代码无法在javac中javac (对于下面的ideone链接,这是sun-jdk-1.8.0_51 ,根据http://ideone.com/faq ): public Object with(Stream<Predicate> predicates) { return predicates.reduce(Predicate::or); } 这是正确的:或者从这个流中合并两个谓词就像写: Predicate a = null; Predicate b = null; a.or(b); // Compiler error! 但是,它确实在intellij中编译,尽管在Predicate::or方法引用上有原始类型警告。 显然,它也会在eclipse中编译(根据原始问题)。 但是这段代码确实: public Object with(Stream<Predicate> predicates) { return predicates.map(a -> a).reduce(Predicate::or); // ^———-^ Added } Ideone演示 尽管我想要尝试这个,但我不清楚为什么这会起作用。 我的手工波形解释是.map(a -> a)就像一个“强制转换”,并且给类型推断算法提供了更多的灵活性来选择允许应用reduce的类型。 但我不确定那种类型到底是什么。 请注意,这不等于使用.map(Function.identity()) ,因为它被约束为返回输入类型。 ideone演示 任何人都可以解释为什么这可以参考语言规范,或者如Holger建议的那样,它是一个编译器错误? […]