java - 为什么在这种情况下需要类型转换?

标签 java casting wildcard

假设我有一个具有以下签名的方法:

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>>

因此,结果可以包含任何类型的类对象(对象的子类型),该方法只返回 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>>();
}

将正常工作。

在您的代码中,由于类型删除,编译器无法确定您的代码在运行时是否正确,因此会报错。

关于java - 为什么在这种情况下需要类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45527067/

相关文章:

java - while循环: negative input checking and adding try catch for strings

java - 如何修复合并排序方法的 ArrayIndexOutOfBoundsException?

javax.net.ssl.SSLProtocolException : SSL handshake aborted: ssl=0x7fa2258640: Failure in SSL library, 通常是协议(protocol)错误

C#根据类型将实现接口(interface)的类转换为类

java - 如何验证 Spring 表单中的日期格式

json - 从 json 转换为 int 不工作?

delphi - 在 Delphi 中强制转换泛型安全吗?

jquery - 在 jQuery 中,如何将特定的通配符字符串保存到变量中?

batch-file - xcopy 通配符源文件夹名称到目标

javascript - 使用通配符的 jQuery 高级选择器