簡體   English   中英

如何確定Java中通用方法的類型?

[英]How to determine type in a generic method in Java?

我想要一個從正確解析的JSON對象中提取數據的方法。 JSONObject(rawdata)擴展了Map,因此如下所示:

private <Type> Type getValue(String key, Type def)
{
    if (!rawdata.containsKey(key)) return def;
    if (!(rawdata.get(key) instanceof Type)) return def;
    return (Type) rawdata.get(key);
}

instanceof顯然會產生一個編譯時錯誤。 參數def是默認值,如果鍵不可用或類型錯誤,則返回該值。 但是def也可以為null,因此def.getClass()無法正常工作。

有什么想法可以檢查Map-entry內容的正確類型嗎?

由於類型擦除,處理默認值可以為null的情況的唯一方法是讓該方法需要一個額外的Class類型的參數-通常更好,因為它允許默認值成為所需類型的子類。

您只需要檢查null(null將被視為任何類型,如果這是不希望的行為,那么您還需要傳遞所需的類)。

private <T> T getValue(String key, T def)
{
    if (!rawdata.containsKey(key)) return def;

    Object value = rawdata.get(key);

    if (def == null) return (T) value; 
    // note that the above is inherently unsafe as we cannot 
    // guarantee that value is of type T

    // this if statement is the same as "value instanceOf Type"
    // is type safe, but not null safe
    if (def.getClass().isAssignableFrom(value.getClass())) {
        return (T) value;
    } else {
        return def;
    }
}

一個更安全的方法簽名是:

private <T> T getValue(String key, T defaultValue, Class<T> defaultClass)

這樣,即使默認值為null,我們也可以安全地檢查類型是否匹配。

在沒有給出默認值的情況下,最好的選擇是接受Class對象作為返回類型。 您可以像這樣重載函數:

private <T> T getValue(String key, Type defaultValue);

private <T> T getValue(String key, Class<T> type);

或者,您可以使用Joshua Bloch撰寫的“ Effective Java Second Edition”一書中的Typesafe異構容器 (THC)模式。

基本上,插入時將商品的Class存儲在地圖中。 檢索時,您會知道類型相同。

Map<Class, Map<String, Object>> rawData = ...

暫無
暫無

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

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