如何将<string,float =“”> Map toString方法转换为通用Number版本

时间:2016-08-24 21:20:27

标签: java generics

我有一种方法可以将Map的内容作为字符串获取,如下所示:

    public static String toStringStringFloatMap(Map<String, Float> stringFloatMap)
    {
        String entries = "";

        Iterator<Entry<String, Float>> it = stringFloatMap.entrySet().iterator();
        while (it.hasNext())
        {
            Map.Entry<String, Float> pair = it.next();
            entries += pair.getKey() + "=" + pair.getValue() + "\n";
        }

        return entries;
    }

现在我正在尝试将其转换为Integer,Short,Double,....的通用版本。我用&#34;替换了所有Float?扩展数字&#34;但.... entrySet()。iterator();语句导致编译错误并告诉我以下内容:

Type mismatch: cannot convert from Iterator<Map.Entry<String,capture#6-of ? extends Number>> to Iterator<Map.Entry<String,? extends Number>>

我不知道#6捕获的是什么?扩展数字&#34;手段。谁能为我解释一下?

修改

Andy指出<?, ?>可能是最好的。

但我的问题仍然是为什么iterator()行无法传递编译器?

    public static String toStringMapError(Map<?, ?> map)
    {
        String entries = "";

        Iterator<Entry<?, ?>> it = map.entrySet().iterator(); <<<<<------- error lineeeeeee
        while (it.hasNext())
        {
            Map.Entry<?, ?> pair = it.next();
            entries += pair.getKey() + "=" + pair.getValue() + "\n";
        }

        return entries;
    }

2 个答案:

答案 0 :(得分:8)

如果你真的想约束Number的子类,请声明一个类型变量,并在整个过程中使用:

public static <T extends Number> String toStringStringNumberMap(Map<String, T> stringFloatMap) {
    String entries = "";

    Iterator<Entry<String, T>> it = stringNumberMap.entrySet().iterator();
    while (it.hasNext())
    {
        Map.Entry<String, T> pair = it.next();
        entries += pair.getKey() + "=" + pair.getValue() + "\n";
    }

    return entries;
}

但您可以简单地将?用于键值:此处没有任何内容需要StringNumber的实例:需要是实现toString()的类型,这意味着Object的任何子类都是可接受的。

public static String toStringMap(Map<?, ?> map) { ... }

您还可以使用增强的for语句,它比显式迭代器更整洁;并且在循环中累积字符串时应始终使用StringBuilder,并避免构建不必要的临时字符串:

StringBuilder sb = new StringBuilder();
for (Map.Entry<?, ?> entry : map.entrySet()) {
  sb.append(entry.getKey());
  sb.append('=');
  sb.append(entry.getValue());
  sb.append('\n');
}
return sb.toString();

答案 1 :(得分:2)

您不应该将Float替换为? extends Number,而是在您的方法中定义泛型类型并使用它:

public static <T extends Number> String toStringStringFloatMap(Map<String, T> stringFloatMap)
    {
        String entries = "";

        Iterator<Map.Entry<String, T>> it = stringFloatMap.entrySet().iterator();
        while (it.hasNext())
        {
            Map.Entry<String, T> pair = it.next();
            entries += pair.getKey() + "=" + pair.getValue() + "\n";
        }

        return entries;
    }