使用通配符遍历此通用SET

时间:2018-07-06 15:57:11

标签: java generics collections

我找不到使用通配符在下面的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());
        }
    }
}

2 个答案:

答案 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}