【问题标题】:Why a cast is necessary in this case?为什么在这种情况下需要演员表?
【发布时间】:2017-08-05 22:55:47
【问题描述】:

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

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

【问题讨论】:

  • 我认为编译器不知道 Class> 会扩展 T。

标签: java casting wildcard


【解决方案1】:

问题似乎是Set&lt;Class&lt;?&gt;&gt; result 中的通配符类型参数,而您的方法返回Set&lt;Class&lt;? extends T&gt;&gt;

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

可以正常工作。

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

【讨论】:

    猜你喜欢
    • 2016-08-08
    • 2016-07-17
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多