首頁 > Java > java教程 > 主體

這是 Java 中的錯誤嗎?

Patricia Arquette
發布: 2024-10-11 10:18:02
原創
663 人瀏覽過

Is this a bug in Java?

最近,我想在Java 中重新建立console.log 的靈活性,所以我決定編寫一個通用的列印函數,它可以接受多個參數並以逗號分隔列印它們,就像JavaScript 或TypeScript 中的console.log。結果呢?我留下的問題多於答案。讓我帶您了解一下。

Java 程式碼

我先用 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 看看它如何處理這個問題。我在 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 的類型系統由於類型擦除而表現不同。在 Java 中,泛型類型資訊會在執行時間被刪除,這表示當您將不同類型傳遞給 T...args 時,Java 不會強制所有參數都具有相同類型。它只是將輸入視為物件。

另一方面,TypeScript 在編譯和執行時都保持嚴格的檢查,確保所有參數都與推斷或聲明的類型相符。

結論

這段經歷讓我思考:Java 是否應該像 TypeScript 一樣強制執行更嚴格的類型檢查?或者說這種彈性是 Java 設計中有意為之的一部分?

你覺得怎麼樣?在 Java 和 TypeScript 之間切換時,您是否遇到過類似的怪癖?我很想在評論中聽到你的想法!

以上是這是 Java 中的錯誤嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板