[英]Type-safe varargs method that initialises a Map
我想編寫一種可用於初始化地圖的方法。 初切:
Map map(Object ... o) {for (int i = 0; i < o.length; i+=2){result.put(o[i], o[i+1])}}
簡單,但不是類型安全的。 使用泛型,也許像這樣:
<TKey, TValue> HashMap<TKey, TValue> map(TKey ... keys, TValue ... values)
但是不支持該語法。 所以最終我來到了這里:
public static <TKey, TValue, TMap extends Map<? super TKey, ? super TValue>> TMap map(TMap map, Pair<? extends TKey, ? extends TValue> ... pairs) {
for (Pair<? extends TKey, ? extends TValue> pair: pairs) {
map.put(pair.getKey(), pair.getValue());
}
return map;
}
public static <TKey, TValue> HashMap<? super TKey, ? super TValue> map(Pair<? extends TKey, ? extends TValue> ... pairs) {
return map(new HashMap<TKey, TValue>(), pairs);
}
public static <TKey, TValue> Pair<TKey, TValue> pair(TKey key, TValue value) {
return new Pair<TKey, TValue>(key, value);
}
public static final class Pair<TKey, TValue> {
private final TKey key;
private final TValue value;
Pair(TKey key, TValue value) {this.key = key; this.value = value; }
public TKey getKey() {return key;}
public TValue getValue() {return value;}
}
但是,當我嘗試時,我需要將其強制轉換:
private static final Map<? extends Class<? extends Serializable>, ? super TypeHandler<? extends Serializable > > validCodeTypes =
/* (Map<? extends Class<? extends Serializable>, ? super TypeHandler<? extends Serializable >>) */
map(
pair(Integer.class, new IntHandler()),
pair(Integer.TYPE, new IntHandler()),
pair(Character.class, new CharHandler()),
pair(Character.TYPE, new CharHandler()),
pair(String.class, new StringHandler())
);
private interface TypeHandler<TType extends Serializable> {}
private static class CharHandler implements TypeHandler<Character> {}
private static class IntHandler implements TypeHandler<Integer> {}
private static class StringHandler implements TypeHandler<String> {}
誰能告訴我如何對map()方法進行編碼,使其完全通用但不需要強制轉換?
為了使您的生活更輕松,請不要使用包含通配符的返回類型。 通常,通配符類型僅用於方法參數。
因此,請嘗試以下操作:
public static <TKey, TValue, TMap extends Map<TKey, TValue>> TMap map(TMap map, Pair<? extends TKey, ? extends TValue>... pairs) {
for (Pair<? extends TKey, ? extends TValue> pair: pairs) {
map.put(pair.getKey(), pair.getValue());
}
return map;
}
public static <TKey, TValue> HashMap<TKey, TValue> map(Pair<? extends TKey, ? extends TValue>... pairs) {
return map(new HashMap<TKey, TValue>(), pairs);
}
我還沒有測試過,但請試試看,您的票價如何。
PS,而不是使用Pair
類型,您可能會發現使用Map.Entry
更容易。
為什么不呢? 我誤會了嗎?
import java.util.HashMap;
import java.util.Map;
public class ToHash {
public static <K, V> Map<K, V> toHash(Object... objects) {
Map<K, V> map = new HashMap<K, V>(objects.length / 2);
if (objects.length % 2 != 0) {
throw new IllegalArgumentException("Odd number of elements: " + objects.length);
}
for (int i = 0; i < objects.length; i += 2) {
map.put((K) objects[i], (V) objects[i + 1]);
}
return map;
}
}
pgdx:您的技術當然可以,但是並不能阻止我說出類似以下內容:
Map<Long, Date> map = toHash("hello", "world");
我在尋找一種允許編譯器選擇任何類型不匹配錯誤的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.