java - 如何将 <String, Float>Map toString 方法转换为通用数字版本

标签 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、.... 的通用版本。我已将所有 Float 替换为“?extends Number”,但 ....entrySet().iterator();语句导致编译错误并告诉我以下内容:

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

我不知道“captured#6-of ? extends Number”是什么意思。谁能给我解释一下?

编辑:

正如 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;
    }

最佳答案

如果你真的想限制到 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;
}

但是您可以简单地使用 ? 作为键 值:这里没有任何东西需要 String 的实例特别是 Number:您所需要的只是实现 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();

关于java - 如何将 <String, Float>Map toString 方法转换为通用数字版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39133207/

相关文章:

java - 如何更改抽屉导航 Activity 中的 Activity

java - 主要方法如何工作?

java - tools.jar问题无法执行目标org.apache.maven.plugins :maven-compiler-plugin

c# - 关键字 'params' 究竟是如何工作的?

Java泛型-构造函数类型

java - Spring Autowiring 参数化泛型类型

java - 在下拉列表中显示从数据库中选择的数据

java - 在 hibernate 聚合函数中使用函数作为参数

泛型类的 scala 宏泛型字段不适用类泛型类型参数

根据调用者的决定返回一个值的c函数