為什么Stream.builder()方法無法自動推斷泛型類型?

為什么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() 不指定參數類型,編譯器將報錯。

解決方案:

為避免此問題,調用泛型構造方法時務必明確指定泛型參數,以便編譯器正確推斷。

? 版權聲明
THE END
喜歡就支持一下吧
點贊13 分享