我嘗試撰寫一個實用方法,它可以從鍵和值陣列填充映射,無論鍵和值的資料型別是什么。
public static <K,V> Map<K,V> fillMap(Map<K,V> map, K[] keys, V[] values) {
int l= keys.length;
for (int i=0; i<l; i )
map.put(keys[i], values[i]);
return map;
}
然后我用
HashMap<Integer, String> map= new HashMap<>();
Integer[] keys= IntStream.range(0, 12).boxed().toArray(Integer[]::new);
String[] values= new String[] {"Jan","Feb","Mar","Apr","Mai","Jun",
"Jul","Aug","Sep","Okt","Nov","Dez"};
map= MyUtil.fillMap(map, keys, values);
并收到錯誤:
不兼容的型別:不存在型別變數 K,V 的實體,因此 Map<K,V> 符合 HashMap<Integer,String>
所有嘗試用變體替換 <K,V> <? extends Object> 等到目前為止都失敗了。如何解決這個問題?
uj5u.com熱心網友回復:
問題
在呈現的代碼中,我們宣告:
HashMap<Integer, String> map = new HashMap<>();
和
public static <K,V> Map<K,V> fillMap(Map<K,V> map, K[] keys, V[] values)
因此,如果我們呼叫
map = MyUtil.fillMap(map, keys, values);
我們嘗試將 a Map<...>(由MyUtil::fillMap)回傳給 a HashMap<...>。這行不通,因為 aMap不是 a HashMap。
可能的解決方案
我想到了兩種方法來解決這個問題:
- 要么改變型別
map, - 或使回傳型別為
MyUtil::fillMap泛型。
1.改變型別map:
我們可以將mapfrom的型別更改HashMap<...>為Map<...>:
Map<Integer, String> map = new HashMap<>();
...
map = MyUtil.fillMap(map, keys, values);
Ideone demo
2. 使回傳型別為MyUtil::fillMap泛型:
通過添加一個額外的泛型引數,我們也可以使回傳型別的具體實作成為泛型:
public static void main(String[] args) {
HashMap<Integer, String> map = new HashMap<>();
final Integer[] keys = IntStream.range(0, 12).boxed().toArray(Integer[]::new);
final String[] values = new String[] {"Jan", "Feb", "Mar", "Apr", "Mai", "Jun",
"Jul", "Aug", "Sep", "Okt", "Nov", "Dez"};
map = MyUtil.fillMap(map, keys, values);
System.out.println(map);
}
public static <K, V, M extends Map<K, V>> M fillMap(M map, K[] keys, V[] values) {
final int l = keys.length;
for (int i = 0; i < l; i ) {
map.put(keys[i], values[i]);
}
return map;
}
Ideone demo
獎勵:回傳值的無狀態構造
如果不需要傳入用于該方法的映射的具體實作,我將提出第三個選項,該選項創建映射以在該方法中回傳:
public static <K, V> Map<K, V> fillMap(K[] keys, V[] values) {
return IntStream.range(0, keys.length)
.boxed()
.collect(Collectors.toMap(
index -> keys[index],
index -> values[index]));
}
Ideone demo
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/405251.html
標籤:
下一篇:如何正確創建方法接受物件串列
