[英]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>>){
將instanceof
與Map<?,?>
將是無用的,因為它仍然更廣泛。 Map<Object, Object>
比Map<String,Object>
寬。
如果您的方法的客戶端聲明了更廣泛的泛型變量: Map<String,Object>String,Object>
,則在Map
的處理過程中,您將必須將Object
為String
。
其他選項:使用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.