我正在使用 Eclipse,當我瀏覽 List.class 的反匯編時,我看到了這個:
<T> T[] toArray(T[] a);
這里的領先
<T>實際上是什么意思?它是回傳型別的一部分嗎?我猜回傳值是T[].在什么情況下函式需要宣告
<T> T[]為函式簽名?
uj5u.com熱心網友回復:
這定義了一種方法,其中某些型別不是固定的,而是通用的。
該方法的非通用版本例如是
String[] toArray(String[] a);
這意味著您提供一個String[]陣列并獲得一個String[]陣列。
給定的方法將 替換String為泛型型別T,這意味著結果型別現在取決于提供的型別 (*),結果陣列型別與作為陣列引數提供的型別相同。
這里相關的陣列型別不需要(完全)對應于整個 List 的泛型型別(Ein List<E>),而是特定于這個方法,所以它必須用這個方法宣告,這就是<T>in<T> T[] toArray(T[] a);
所以,分解<T> T[] toArray(T[] a);成它的部分:
<T>宣告以下方法具有某些特定于方法的泛型型別T。T[]表示回傳值是這個泛型型別的陣列。toArray(...)命名方法。T[] a宣告該方法需要一個陣列型別的引數。
使用 Java 泛型,編譯器需要找到T在任何給定方法呼叫中替換的特定型別,例如
??? myArray = myList.toArray(new String[17]);
在這里,引數給出了資訊:String[]提供了一個陣列,需要一個T[]陣列,所以Tmust be String,現在編譯器知道在結果型別T[]中T也必須替換String為,給出String[]結果型別,這意味著???必須是String[]或兼容,否則會出現編譯器錯誤。
除了這種基于演繹的型別匹配之外,還有一種(很少使用)語法來顯式指定泛型型別。那將是
String[] myArray = myList.<String>toArray(new String[17]);
中<String>綴明確告訴編譯器T替換。在大多數情況下,這種顯式規范是多余的,因此您幾乎不會在實際代碼中看到這種語法。
(*) Java 泛型在編譯時完全評估,因此宣告的泛型效果僅基于編譯器看到的型別。所以,例如在
Object[] myObjectArray = new String[0];
??? myResultArray = myList.toArray(myObjectArray);
必須???是Object[],盡管在運行時String[]會生成一個陣列。
uj5u.com熱心網友回復:
請記住,泛型背后的想法是在型別上引數化一個類,并且在實體化該類時指定該型別。<T>是型別引數——也就是說,你寫的是說這個類/方法是T在運行時指定的某種型別上引數化的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494522.html
