我找不到使用通配符在下面的SET上进行迭代的方法。我还尝试过像在有效Java中提到的那样转换它,但仍然会遇到编译错误。
public void testWildCardIteration() {
LinkedHashMap<String, ?> result = new LinkedHashMap<>();
Set<Map.Entry<String, ?>> entrySet = // entries....
iterHelper(entrySet, result);
}
private <E> void iterHelper(Set<Map.Entry<String, E>> entrySet , LinkedHashMap<String, E> result) {
for (Map.Entry<String, E> entry : entrySet) {
String tmpkey = entry.getKey();
if (tmpkey.startsWith("KEY")) {
result.put(entry.getKey(), entry.getValue());
}
}
}
答案 0 :(得分:1)
不需要psql
方法范围。
由于未指定任何界限,因此默认情况下使用E
。
相反,将Object
指定为?
的{{1}}类型,并指定Entry.value
作为entrySet
的{{1}}类型。
请注意,您不能将Object
指定为Entry.value
之类的类型,因为您不想在集合中添加result
。但是使用?
之类的Set<?>
,您可以做到。
null
您现在可以调用它:
Object
答案 1 :(得分:1)
您可以在只读集合中使用通配符。但是您将必须使用super
下界通配符,该通配符将应用于您要编写的集合。
本质上,这应该编译:
public void testWildCardIteration() {
LinkedHashMap<String, ? super Object> result = new LinkedHashMap<>(); // write collection
Set<Map.Entry<String, ?>> entrySet = new HashSet<>(); // read collection
iterHelper(entrySet, result);
}
private void iterHelper(Set<Map.Entry<String, ?>> entrySet, LinkedHashMap<String, ? super Object> result) {
for (Map.Entry<String, ?> entry : entrySet) {
String tmpkey = entry.getKey();
if (tmpkey.startsWith("KEY")) {
result.put(entry.getKey(), entry.getValue());
}
}
}
这是一个简单的测试,显示了代码的工作情况:
public static void testWildCardIteration() {
LinkedHashMap<String, ? super Object> result = new LinkedHashMap<>();
Set<Map.Entry<String, ?>> entrySet = new HashSet<>();
entrySet.add(new AbstractMap.SimpleEntry<String, Object>("KEY", "BLAH"));
iterHelper(entrySet, result);
System.out.println(result);
}
private static void iterHelper(Set<Map.Entry<String, ?>> entrySet, LinkedHashMap<String, ? super Object> result) {
for (Map.Entry<String, ?> entry : entrySet) {
String tmpkey = entry.getKey();
if (tmpkey.startsWith("KEY")) {
result.put(entry.getKey(), entry.getValue());
}
}
}
public static void main(String[] args) {
testWildCardIteration();
}
打印输出:
{KEY=BLAH}