簡體   English   中英

如何找到Java泛型類的類對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM