当前位置: 首页 > 图灵资讯 > 技术篇> 为什么Stream.builder()方法无法自动推断泛型类型?

为什么Stream.builder()方法无法自动推断泛型类型?

来源:图灵教育
时间:2025-02-27 17:31:02

为什么stream.builder()方法无法自动推断泛型类型?

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.builder() 时, 指定内部泛型 T 的类型为 Integer。由于没有提供输入参数,T 默认设置为 Object。

更广泛的问题:

此问题并非 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 getBuilder() 时, 指定内部泛型类型,但如果 new MyTest() 编译器将在没有指定参数类型的情况下报错。

解决方案:

为了避免这个问题,在调用泛型结构方法时,必须明确指定泛型参数,以便编译器能够正确推断。

以上就是为什么Streamm.builder()方法不能自动推断泛型?详情请关注图灵教育的其他相关文章!