2012-07-18 111 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