確定泛型類型的類別
在泛型程式設計中,通常需要存取正在使用的泛型類型的類別。然而,通用類型資訊在運行時會被刪除,這使得這項任務本身就具有挑戰性。本文探討了克服此限制的有效解決方法。
挑戰
考慮以下程式碼片段:
public class MyGenericClass<T> { public void doSomething() { T bean = (T)someObject.create(T.class); } }
此程式碼嘗試使用第三方函式庫的create 方法建立類型T 的實例,該類型T 的實例,該類型方法需要T 的實際類別作為參數。但是,直接存取 T.class 會導致類型參數 T 的非法類別文字錯誤。
解決方法
由於泛型類型資訊在運行時被刪除,因此可以使用替代方法方法是必要的。以下解決方法涉及建立一個接受泛型類型的類別作為參數的靜態工廠方法:
public class MyGenericClass<T> { private final Class<T> clazz; public static <U> MyGenericClass<U> createMyGeneric(Class<U> clazz) { return new MyGenericClass<U>(clazz); } protected MyGenericClass(Class<T> clazz) { this.clazz = clazz; } public void doSomething() { T instance = clazz.newInstance(); } }
用法
要使用此解決方法,請建立一個使用createMyGeneric 工廠方法的MyGenericClass 實例:
MyGenericClass<MyClass> genericInstance = MyGenericClass.createMyGeneric(MyClass.class);
這提供了對實際類別的存取透過MyGenericClass 實例中的clazz 欄位的泛型類型。
缺點
雖然此解決方法有效,但它向解決方案添加了一些樣板程式碼。此外,它還限制了 doSomething 方法中泛型方法或建構函數的使用,因為它們無法直接存取泛型類型資訊。
以上是如何在運行時確定泛型類型的類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!