为何Java嵌套Lambda函数在部分场景下返回类型推断异常?
Java嵌套Lambda与泛型的类型推断异常现象
我在Java中使用嵌套Lambda函数和泛型时,发现类型推断机制存在一些异常行为(Java 8测试过,新版本也有类似结果)。示例代码如下:
Stream<Stream<Integer>> stream = ...; // 仅作示例,无实际业务意义 // 推断一下返回类型! stream.map((inner) -> inner.map((i) -> i)); stream.map((inner) -> inner.map((i) -> ""));
实际运行中,这两个映射表达式的返回类型都是**Stream<Stream<Object>>**,而非预期的Stream<Stream<Integer>>和Stream<Stream<String>>。第二个表达式的返回类型本应明确,没法用Java无法推断返回类型来解释。
更奇怪的是,做出如下修改时:
stream.map((inner) -> inner.map((Integer i) -> i)); // 显式声明参数类型 stream.map((inner) -> inner.map((i) -> i).findAny().get()); // 链式调用方法 stream = stream.map((inner) -> inner.map((i) -> i)); // 赋值给指定类型变量
内部Lambda的返回类型会被推断为**Integer**,尽管Lambda本身并未改变(第三种情况是因为提供了更多类型信息才有助于推断),这让人困惑。
我曾查阅过相关话题,但仍未完全理解原因。
后续更新:该问题由不符合语言标准的旧版Eclipse导致,代码本身不存在问题。
内容的提问来源于stack exchange,提问作者Wilderness Ranger
相关产品推荐
相关产品推荐

