[英]Generic method return type
泛型方法返回類型是否基於值引用解析? 例如
public class TestGenericMethod
{
public static void main(String[] args)
{
TestGenericMethod dis = new TestGenericMethod();
String str = dis.getFirst(singletonList("String"));
System.out.println("| String ==> " + str);
Integer in = dis.getFirst(singletonList(5));
System.out.println("| Integer ==> " + in);
}
private <T> T getFirst(List<Object> objs)
{
return (T) objs.get(0);
}
}
參考代碼段,此代碼可以正常編譯和運行。 我在這里的問題是,由於我沒有將類型轉換列表對象專門鍵入我的類型,因此返回類型仍然與String
和Integer
兼容。 那么返回類型是根據值引用來解決的嗎?
返回類型由編譯器根據您將結果分配給( str
, in
)的變量的類型來推斷。
當然,返回值的實際類型將是列表中第一個對象的類型,並且在運行時可能會收到ClassCastException,因為您的代碼不是類型安全的,並且您忽略了未經檢查的泛型轉換。 嘗試例如
Integer oops = dis.getFirst(singletonList("hello"));
編譯器會嘗試推斷T
,在這種情況下,唯一可以推斷出T
的地方就是查看要存儲返回T
的變量的類型。
如其他答案中所述,返回類型是由編譯器從目標變量類型推斷出來的。 幕后細節。
如果檢查類的字節碼,則getFirst()
方法的實際返回類型為Object
。
// signature <T:Ljava/lang/Object;>(Ljava/util/List<Ljava/lang/Object;>;)TT;
private getFirst(Ljava/util/List;)Ljava/lang/Object;
在運行時,JVM將檢查從getFirst()
返回的對象的實際類型,如果不同,則拋出ClassCastException。
INVOKESPECIAL TestGenericMethod.getFirst (Ljava/util/List;)Ljava/lang/Object;
CHECKCAST java/lang/Integer
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.