使用反射在Java 中獲取泛型參數類型
在Java 中,泛型類型是一個強大的功能,它允許更靈活和可重複使用的程式碼。然而,使用通用參數有時可能會很棘手。一個常見的挑戰是在運行時確定泛型參數的實際類型。
可能嗎?
是的,可以取得泛型參數的型別使用反射。反射提供了一種在執行時間存取和操作有關 Java 類別的結構、欄位和方法的詳細資訊的方法。
範例:
考慮以下程式碼片段:
public class Voodoo { public static void chill(List<?> aListWithTypeSpiderMan) { // Here I'd like to get the Class-Object 'SpiderMan' Class typeOfTheList = ???; } public static void main(String... args) { chill(new ArrayList<SpiderMan>()); } }
在 chill 方法中,我們有一個未知類型的清單。我們想要確定實際的類型參數,在本例中應該是 SpiderMan。
解決方案:
解決方案涉及使用 ParameterizedType 接口,它是一種類型描述參數化類型的類型,例如使用泛型的類型。以下是我們如何實現它:
Class typeOfTheList = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
這段程式碼取得目前類別的超類別(在本例中為 Voodoo),它應該是一個參數化類型,然後提取實際的類型參數。第一個類型參數對應於我們感興趣的類型參數,即 SpiderMan。
注意:
Java 16 之前不完全支援此技術。早期對泛型類型使用反射被認為是 hacky,但從 Java 16 開始,getActualTypeArguments() 已添加到 Type 介面中,提供了一種更乾淨、更簡化的方式存取通用類型資訊。
以上是如何使用反射來取得 Java 中的泛型參數類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!