[英]How to find the class object of Java generic type?
假設我有一個通用類型P
,它是一個Enum,即<P extends Enum<P>>
,我想從字符串中獲取Enum值,例如:
String foo = "foo";
P fooEnum = Enum.valueOf(P.class, foo);
這將導致編譯錯誤,因為P.class
無效。 那么,為了使上述代碼有效,我該怎么辦?
您必須在某處具有此泛型類型的運行時實例,以便您可以通過Enum#getDeclaringClass()
獲取聲明類。 假設你已經將P p
聲明為某個方法參數,這是一個例子。
例如
public static <P extends Enum<P>> P valueOf(P p, String name) {
return Enum.valueOf(p.getDeclaringClass(), name);
}
Java中沒有辦法。 擦除通用類型並將其轉換為字節代碼中的Object
。 泛型類型(在您的情況下為“P”)不是真正的類,而只是占位符。
有關類型擦除的好答案,請查看此問題 。
Java使用稱為類型擦除的東西來實現泛型。 這意味着實際的通用參數在運行時被擦除。 因此,您無法從泛型類型參數中推斷出類型信息。
您可以通過讓調用者或某個配置提供程序在運行時獲取它。 例如,您可以使用Spring或其他任何配置。
class Converter<P extends Enum> {
private Class<P> type;
//setter and getter
public P valueOf(String name) {
return Enum.valueOf(type, name);
}
}
然后在需要的地方配置它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.