簡體   English   中英

為什么Java編譯器知道要對數組執行什么操作卻不知道要對泛型做什么?

[英]Why the Java compiler know what you want to do with arrays but cannot know what you want to do with generics?

我在閱讀《 Java的第4版思維》,在《泛型》一章中找到了以下句子:本段說明了為什么數組支持協方差而泛型卻不支持。

真正的問題是我們在談論容器的類型,而不是容器所容納的類型。 與數組不同,泛型沒有內置的協方差。 這是因為數組是用該語言完全定義的,因此可以內置編譯時和運行時檢查,但是使用泛型時,編譯器和運行時系統無法知道您要對類型做什么以及應遵循哪些規則是。

但是我不能真正理解本段的含義,為什么編譯器知道要對數組執行的操作卻不知道要對泛型執行的操作? 有人可以給我例子嗎?

首先,報價非常不清楚。 數組和泛型都“完全用語言定義”,盡管使用的方式不同。 而且,編譯器和運行時系統都無法理解您的想法,因此也不知道“您想對類型做什么”。

引號似乎是指對數組進行了格式化,而泛型則不是:在運行時, List的元素類型未知,而數組的元素類型是已知的。 即:在運行時, List<String>List<Integer>都具有相同的類型( List ),而String[]Integer[]具有不同的類型。 但是,在編譯時, List<String>List<Integer>是不同的類型。

其原因主要是歷史原因。 數組是在Java的第一個版本中引入的,沒有理由不在運行時公開數組的元素類型。 但是,當在Java 5中引入泛型時,目標是使新的Java代碼與舊的Java代碼兼容(反之亦然),因此必須在運行時刪除泛型。

為了支持遺留代碼,Java的較新版本允許將類型安全的代碼與較早的代碼一起使用。 創建字節碼時,Java編譯器將所有類型安全的聲明替換為相關的強制類型轉換(如果不存在類型參數,則將其廣播到Object)。 因此,產生的字節碼僅包含普通的類,接口和方法。 這稱為類型擦除。 (所有這些麻煩僅是為了支持遺留代碼)。

您可以在我的博客上詳細解釋在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM