簡體   English   中英

我應該如何使用番石榴TypeToken反射性地實例化參數化類型?

[英]How should I reflectively instantiate a parametrized type using guava TypeToken?

我的類TypeRegisterer允許客戶端注冊參數化類型(使用與TypeRegisterer相同的參數),然后使用其原始類型名稱實例化它們。

我當前的解決方案有效,但是我有一個未經檢查的強制轉換警告,並且不確定是否可以忽略。 有一個更好的方法嗎?

public class TypeRegisterer<T> {
    private Map<String, TypeToken<? extends Base<T>>> registeredTypes;

    public void registerType(TypeToken<? extends Base<T>> typeToken) {
        registeredTypes.put(typeToken.getRawType().getSimpleName(), typeToken);
    }

    public Base<T> initType(String className, T feature) throws Exception {
        // validation and exception handling removed for brevity
        TypeToken<? extends Base<T>> ruleType = registeredTypes.get(className);

        @SuppressWarnings("unchecked")
        Class<? extends Base<T>> rawType = (Class<? extends Base<T>>) ruleType .getRawType();

        return rawType.getConstructor().newInstance();
    }
}

沒關系-參數化類型是使用類型erasure編譯的,因此參數信息在運行時不可用。

在運行時, Class<Base<T>> == Class<Base<Integer>> == Class<Base<Double>>等,因此rawType變量引用的類對象足以實例化該類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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