最近,我想在Java 中重新建立console.log 的靈活性,所以我決定編寫一個通用的列印函數,它可以接受多個參數並以逗號分隔列印它們,就像JavaScript 或TypeScript 中的console.log。結果呢?我留下的問題多於答案。讓我帶您了解一下。
我先用 Java 寫一個簡單的泛型函數,它接受 T 類型的可變參數並列印它們,用逗號分隔值:
public class Main { public static void main(String[] args) { Main.print(1, "4", new ArrayList<>()); // Expected type issues, but it ran without any problem! } private static <T> void print(T... args) { System.out.println(Arrays.toString(args)); } }
當我傳遞混合類型(Integer、String 和 ArrayList)時,我預期 Java 的嚴格類型會警告我或拋出錯誤,但事實並非如此。程式碼編譯並運行得很好,列印 [1, 4, []] 沒有任何抱怨。
這讓我感到驚訝,因為身為一個也使用 TypeScript 的人,這感覺很不舒服。 Java 不應該捕獲這種類型不一致嗎?
自然地,我轉向 TypeScript 看看它如何處理這個問題。我在 TypeScript 中寫了一個類似的函數:
function print<T>(...args: T[]) { console.log(args.join(",")); } print(1, "4", []); // TS warns (which makes sense): // Argument of type 'string' is not assignable to parameter of type 'number'.
正如預期的那樣,TypeScript 拋出了警告!由於 TypeScript 根據第一個參數 (1) 將類型 T 推斷為數字,因此它將第二個和第三個參數(「4」和 [])標記為無效。這種行為非常有意義,因為 TypeScript 強制泛型函數使用一致的類型。
不一定。這裡發生的事情是 Java 的類型系統由於類型擦除而表現不同。在 Java 中,泛型類型資訊會在執行時間被刪除,這表示當您將不同類型傳遞給 T...args 時,Java 不會強制所有參數都具有相同類型。它只是將輸入視為物件。
另一方面,TypeScript 在編譯和執行時都保持嚴格的檢查,確保所有參數都與推斷或聲明的類型相符。
這段經歷讓我思考:Java 是否應該像 TypeScript 一樣強制執行更嚴格的類型檢查?或者說這種彈性是 Java 設計中有意為之的一部分?
你覺得怎麼樣?在 Java 和 TypeScript 之間切換時,您是否遇到過類似的怪癖?我很想在評論中聽到你的想法!
以上是這是 Java 中的錯誤嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!