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
解决方案:
为了避免这个问题,在调用泛型结构方法时,必须明确指定泛型参数,以便编译器能够正确推断。
以上就是为什么Streamm.builder()方法不能自动推断泛型?详情请关注图灵教育的其他相关文章!
