2017-08-05 123 views
3

比方说,我有一个具有以下签名的方法:为什么在这种情况下演员是必要的?

public static <T> Set<Class<? extends T>> dosomething(Class<T> clazz) 

如果我想这使用通配符类,就像在下面的例子中

Class<?> clazz = Integer.class 
Set<Class<?>> result = dosomething(clazz); 

编译器抱怨以下调用:

Error: incompatible types: inference variable T has incompatible equality constraints java.lang.Object,capture#1 of ? 

所以解决方法是在方法调用中添加一个强制转换。

Set<Class<?>> result = (Set<Class<?>>) dosomething(clazz); 

我想知道这是为什么中投需要在这一特殊情况下,如果有什么解决办法,以避免铸造... 我用java-8这一点。 感谢

+1

我想编译器不知道类会延长T. –

回答

1

这个问题似乎是在Set<Class<?>> result通配符类型参数,而你的方法返回Set<Class<? extends T>>

那么,结果可能包含任何类型的类对象(Object的亚型),该方法只返回一个对象是是T的子类型(如编译器错误中提到的)。

无论这个

public static void main(String[] args) { 
    Class<?> clazz = Integer.class; 
    Set<Class<?>> result = dosomething(clazz); 
} 

public static <T> Set<Class<?>> dosomething(Class<T> clazz){ 
    return new HashSet<Class<?>>(); 
} 

或本

public static void main(String[] args) { 
    Class<Integer> clazz = Integer.class; 
    Set<Class<? extends Integer>> result = dosomething(clazz); 
} 

public static <T> Set<Class<? extends T>> dosomething(Class<T> clazz){ 
    return new HashSet<Class<? extends T>>(); 
} 

将工作没有错误。

在您的代码中,由于类型擦除,编译器无法确定您的代码在运行时是否正确,因此存在抱怨。

相关问题