2013-07-11 37 views
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的泛型数组”,这是显而易见的。我该如何解决这个问题?

+0

简短的回答:选取其他语言:) – feralin

+6

@feralin较长,真正有用的答案会更好。 Java泛型系统中一些明显的缺陷可以通过使用显式类型令牌来实现。不幸的是,当类型参数本身被参数化时,这些不起作用,但这不是这种情况。不知道如何在Java中执行此操作不是拖钓的好借口。 – millimoose

+0

@feralin我在C#和Java方面拥有同等的专业知识,所以对它们进行比较会有很大的争议。 –

回答

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); 
+0

没有通过clazz没有办法?通过在运行时确定密钥的类型,我不能这样做吗? –

+0

不,由于泛型中的类型擦除,类型在运行时不知道,因此您没有机会猜测它。在运行时,'Map '基本上变成'Map '。 –

+0

+1,还有其他的方法,我做了我自己的回答。以前我应该多试一点。 :-) –

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); 
} 
+1

+1感谢您的回答。 –