2013-07-11 78 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感謝您的回答。 –