为什么在这种情况下演员是必要的?
问题描述:
比方说,我有一个具有以下签名的方法:为什么在这种情况下演员是必要的?
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这一点。 感谢
答
这个问题似乎是在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>>();
}
将工作没有错误。
在您的代码中,由于类型擦除,编译器无法确定您的代码在运行时是否正确,因此存在抱怨。
我想编译器不知道类>会延长T. –