簡體   English   中英

Java 中 generics 的層次結構信息

[英]Hierarchy information for generics in Java

我知道雖然List< Integer>不是List< Number>的子類型,但它是List<? extends Number> List<? extends Number>

But as Java uses concept of type erasure to implement generics, meaning that we ultimately have single class for all representations, and hence we don't have any class hierarchy defined for such classes in bytecode, then how does Java establishes this hierarchy?

Java 不是字節碼,它編譯為字節碼。 正因為如此,它才能成為比字節碼更強大的語言。

Java 語言在Java 語言規范中指定。 JVM 不知道此規范中的許多內容。 參數化類型就是其中之一。 但這很好,因為編譯器的工作是將 Java 源代碼轉換為 JVM可以理解的內容。 對於泛型類型,這意味着刪除泛型參數並添加大量類型轉換。

因此我們沒有為字節碼中的此類類定義任何 class 層次結構,那么 Java 如何建立此層次結構?

到 Java 編譯器, List<? extends Object> List<? extends Object>List<Object>是不同的類型。 這是強制類型安全所必需的。 JVM 認為它們相同有關系嗎? 不是真的,因為編譯器本身就是一個獨立的程序。 它可以阻止您的代碼編譯/允許您的代碼在不“咨詢”JVM 的情況下進行編譯。 編譯器知道List< Number>List<? extends Number> List<? extends Number> 它知道類型層次結構,因此它可以在編譯時強制執行它。

那么運行時呢? 正如你想象的那樣,generics 的這種類型層次結構無法在運行時強制執行,因為 JVM 不知道 generics。 例如,這不會引發異常:

public class Main {

    public static ArrayList<Object> list;

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        ArrayList<String> list = new ArrayList<>();
        // here we are doing the equivalent of:
        // Main.list = list;
        // using reflection (hence at runtime)
        Main.class.getField("list").set(null, list);
    }
}

暫無
暫無

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

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