在这种情况下为什么需要演员?

时间:2017-08-05 22:55:48

标签: java casting wildcard

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

Button btn = new Button ("can wrap that text") ;
btn.wrapTextProperty().setValue(true)

如果我尝试使用通配符类调用它,如下例所示

<Button mnemonicParsing="false" prefHeight="50.0" prefWidth="300.0"  text="Can wrap that text" wrapText="true"/>

编译器抱怨以下内容:

read -p "Please input a user name: "
cat /etc/passwd | grep "$*" wc -l > compare

if [[ $compare == 0 ]]
then echo "Username not found."

else
cat compare | grep "disabled" | wc -l

fi

因此,修复方法是在方法调用中添加一个强制转换。

if(!defined('INSYSTEM')) {
    exit;
}

我想知道为什么在这种特殊情况下需要演员表,如果有任何解决方法可以避免演员...... 我正在使用java-8。 感谢

1 个答案:

答案 0 :(得分:1)

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

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

无误地工作。

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

相关问题