[英]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.