当前位置:  开发笔记 > 编程语言 > 正文

初始化Map的类型安全的varargs方法

如何解决《初始化Map的类型安全的varargs方法》经验,为你挑选了1个好方法。

我想写一个可以用来初始化Map的方法.首裁:

Map map(Object ... o) {for (int i = 0; i < o.length; i+=2){result.put(o[i], o[i+1])}}

简单,但不是类型安全的.使用泛型,可能是这样的:

 HashMap map(TKey ... keys, TValue ... values) 

但是不支持该语法.所以最终我来到这个:

public static > TMap map(TMap map, Pair ... pairs) {
    for (Pair pair: pairs) {
        map.put(pair.getKey(), pair.getValue());
    }
    return map;
}

public static  HashMap map(Pair ... pairs) {
    return map(new HashMap(), pairs);
}

public static  Pair pair(TKey key, TValue value) {
    return new Pair(key, value);
}

public static final class Pair {
    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, ? super TypeHandler > validCodeTypes =
    /* (Map, ? super TypeHandler>) */
 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 {}

private static class CharHandler implements TypeHandler {}
private static class IntHandler implements TypeHandler {}
private static class StringHandler implements TypeHandler {}

任何人都可以告诉我如何编码我的map()方法,以便它是完全通用的,但不需要被铸造?



1> Chris Jester..:

为了让自己的生活更轻松,请不要使用包含通配符的返回类型.通常,通配符类型仅用于方法参数.

所以,试试这个:

public static > TMap map(TMap map, Pair... pairs) {
    for (Pair pair: pairs) {
        map.put(pair.getKey(), pair.getValue());
    }
    return map;
}

public static  HashMap map(Pair... pairs) {
    return map(new HashMap(), pairs);
}

我没有测试过,但是试一试,看看你的表现如何.

PS,而不是使用化妆Pair类型,你可能会发现它更容易使用Map.Entry.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有