2012-07-18 108 views
2

我有一個名爲toSet()的靜態實用程序方法,它接收對象並返回Set無法推斷類的類型<?>

public static <T> Set<T> toSet(T item, T... otherItems) { 
    Set<T> items = new HashSet<T>(); 
    items.add(item); 
    items.addAll(Arrays.asList(otherItems)); 
    return items; 
} 

的方法正常工作與其他對象,但會產生編譯時,我想使Class<?>Set

Set<String> strings = toSet("OK", "This works well", "No problem"); 
Set<Integer> numbers = toSet(1, 2, 3, 4, 5); 

Class<?> test = String.class; 
    Set<Class<?>> entities = toSet(test); 

將產生Type mismatch: cannot convert from Set<Class<capture#5-of ?>> to Set<Class<?>>

難道我做錯了什麼嗎?如何在不投射的情況下實現這一點?

謝謝先進。

+1

找到更詳細的信息:[在返回類型推斷通配符泛型(可能重複的HTTP ://stackoverflow.com/questions/1294227/inferred-wildcard-generics-in-return-type) – 2012-07-18 03:27:45

+0

@PaulBellora:非常感謝鏈接。這非常有幫助。 – Genzer 2012-07-18 06:09:28

回答

4

在這種情況下,看起來類型推斷失敗了,原因可能是其他人希望解釋的原因。鑄造是沒有必要的 - 只是明確指定類型參數:

Set<Class<?>> entities = MyClass.<Class<?>>toSet(test); 
+0

謝謝,它的作品!解決此問題的另一種方法是使用PaulBellora上面鏈接的問題的答案。總而言之,在這種情況下,我必須明確地聲明編譯器知道的類型。 – Genzer 2012-07-18 06:11:30

0

嘗試這種方式也:

Class<String> test = String.class; 
Set<Class<String>> entities = toSet(test); 
+0

感謝您的回答。但是在這裏,我想對'Class '('Class'的每個實例,不僅僅是'Class ')做一個'Set'。 – Genzer 2012-09-16 02:28:20