Stream.builder() 泛型类型推断问题详解
Stream.builder() 方法的泛型参数在直接调用时,编译器无法自动推断。这是因为调用构造方法时缺少显式类型参数,编译器默认将其设置为 Object,导致最终结果为 Stream
代码示例:
// 默认类型参数,编译通过 Stream<Object> build = Stream.builder().add(1).build(); // 编译器报错,类型参数未知 Stream<Integer> build2 = Stream.builder().add(1).build(); // 指定泛型类型,编译通过 Stream<Integer> build3 = Stream.<Integer>builder().add(1).build();
根本原因:
理解编译器泛型推断的关键在于泛型构造方法的调用方式。构造方法左侧的泛型参数定义了输入参数的类型,右侧定义了类内部泛型的类型。
Stream.builder() 方法的源码类似于:
public static <T> Builder<T> builder() { return new Streams.StreamBuilderImpl<T>(); }
调用 Stream.
更广泛的问题:
此问题并非 Stream.builder() 独有。任何泛型类的泛型构造方法都可能遇到类似情况。
例如:
public class MyTest<T, R> { T data; R member; public <U> MyTest(T data, U param, R member) {} public static <T, R> MyTest<T, R> getBuilder() { return new MyTest<>(); } public static void main(String[] args) { // 指定输入参数泛型,类泛型可省略 MyTest<Integer, String> myTest = new MyTest<>(233, true, "123"); // 未指定输入参数泛型,类泛型需要显式指定 MyTest<Integer, String> myTest1 = MyTest.<Integer, String>getBuilder(); } }
调用 MyTest
解决方案:
为避免此问题,调用泛型构造方法时务必明确指定泛型参数,以便编译器正确推断。
以上就是为什么Stream.builder()方法无法自动推断泛型类型?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号