我有一种方法可以将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;
}
答案 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;
}
但您可以简单地将?
用于键和值:此处没有任何内容需要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();
答案 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;
}