3

我有以下方法:

public static <T, U> T[] getKeysForValue(Map<T,U> map,U value){
    if(map == null || map.isEmpty()) {
        return null;
    }

    Set<T> keys = new HashSet<T>();

    for (Map.Entry<T,U> entry : map.entrySet()) {
        if (entry.getValue().equals(value)) {
            keys.add(entry.getKey());
        }
    }

    return keys.toArray(new T[keys.size()]);
}

我在线上遇到编译错误:keys.toArray(new T[keys.size()]),上面写着“无法创建 T 的通用数组”,这很明显。我该如何解决这个问题?

4

2 回答 2

5

为什么不直接退货Set?无论如何,在这种情况下,这似乎更有意义。

public static <T, U> Set<T> getKeysForValue(Map<T, U> map, U value) {
    ...

    return keys;
}

如果您仍想返回一个数组,另一种选择是将要填充的数组作为参数传递:

public static <T, U> T[] getKeysForValue(Map<T,U> map, U value, T[] dest) {
    ...

    return keys.toArray(dest);
}
于 2013-07-11T14:05:30.057 回答
4

您应该将对应的类T作为方法的参数传递并调用Array.newInstance(clazz, size)

public static <T, U> T[] getKeysForValue(Class<T> clazz, Map<T,U> map,U value){

  T[] array = (T[])Array.newInstance(clazz, size);
于 2013-07-11T14:05:34.303 回答