簡體   English   中英

泛型是否綁定了Java中方法簽名的一部分?

[英]Is generics bound part of method signature in Java?

我今天意識到這個編譯並運行良好:

public class Test {
    public static <T> T handle(T val) {
        System.out.println("T");
        return val;
    }

    public static <T extends String> T handle(T val) {
        System.out.println("T extends String");
        return val;
    }
}

兩個handle方法具有相同的名稱,相同的數字和類型( ? )的參數。 唯一的區別是第二個handle方法具有更嚴格的通用邊界。 IDE根本沒有抱怨,代碼編譯得很好。 在運行時方法按預期選擇 - 例如, Test.handle("this is a string")將調用第二個方法, Test.handle(10)將調用第一個方法。

泛型綁定是否被認為是方法簽名的一部分? 或者它是一種方法重載決議魔術?

泛型提供編譯時類型安全性; 在運行時,您的方法將擦除以下內容:

public static Object handle(Object val) {
    System.out.println("T");
    return val;
}

public static String handle(String val) {
    System.out.println("T extends String");
    return val;
}

由於方法重載,在傳遞String時將調用handle(String) ,並且在傳遞任何其他Object時將調用handle(Object) (請記住String是final並且沒有子節點)。

考慮了泛型的界限。

在第一種情況下,綁定是Object; 在第二種情況下,綁定是String。

當擦除類型時,使用綁定代替類型變量,因此這些只是分別過載(和返回)Object和String參數。

沒有錯。

暫無
暫無

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

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