簡體   English   中英

如何檢查在Java中收到的通用my方法?

[英]How to check the generic my method received in Java?

我有一個set方法,需要接受2種泛型:

  • Map<Long,Map<String,Object>>
  • Map<Long,Map<String,String>>

但是我需要將其設置為Map<Long,Map<String,String>>

我知道String是一個對象,因此在參數中我可以使用Map<Long,Map<String,Object>> ,但是我不需要進行轉換。 使用instanceof似乎無法正常工作,並拋出錯誤:

無法對參數化類型Map<Long,Map<String,String>>執行instanceof檢查。 請改用Map<?,?>形式Map<?,?>因為在運行時將刪除更多的泛型類型信息

以下是我現在擁有的當前代碼。

public void setRates(Map<Long,Map<String,Object>> inputRates){

    if(inputRates!=null){
        Map<Long,Map<String,String>> result = new HashMap<>();
        // if <Map<Long,Map<String,String>> do below :
        if(inputRates instanceof Map<Long,Map<String,String>>){
        //instanceof not working....   
            this.rates= inputRates;
        }else{
            // if really Map<Long,Map<String,Object>> do below - converting Object to String
            for (Map.Entry<Long, Map<String,Object>> entry1 : inputRates.entrySet()) {
                Map<String,String> resultMap = new HashMap<>(); 

                Long key = entry1.getKey();
                Map<String,Object> inputMap = entry1.getValue();
                for(Map.Entry<String,Object> entry2 : inputMap.entrySet()) { 
                    String key2 = entry2.getKey();
                    Object value2 = entry2.getValue();
                    if(value2!=null){
                        resultMap.put(key2, value2.toString());  
                    }else{
                        resultMap.put(key2, null);  
                    }
                }
                result.put(key, resultMap);
            }
            this.rates = result;
        } 
    }
}

我如何實現這個想法?

您可以使用generic method

public <T> void setRates(Map<Long,Map<String, T>> inputRates){ }

然后在方法的主體中使用通用類型T

泛型在編譯后被擦除。 因此,您永遠不能將instanceof與參數化類型類一起使用:

if(inputRates instanceof Map<Long,Map<String,String>>){

instanceofMap<?,?>將是無用的,因為它仍然更廣泛。 Map<Object, Object>Map<String,Object>寬。

如果您的方法的客戶端聲明了更廣泛的泛型變量: Map<String,Object>String,Object> ,則在Map的處理過程中,您將必須將ObjectString

其他選項:使用Map<Long,Map<String,String>>作為參數創建一個新方法。
客戶端會根據操作者的要求呼叫第一個或第二個。

您可以使用以下命名類重載:

class ObjectMap extends Map<Long,Map<String,Object>>{}
class StringMap extends Map<Long,Map<String,String>>{}
public void setRates(ObjectMap inputRates){ }
public void setRates(StringMap inputRates){ }

它們將作為參數化的部分工作,但是您需要實例化然后代替。

暫無
暫無

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

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