Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么';这个普通演员不是失败了吗?_Java_Generics_Casting - Fatal编程技术网

Java 为什么';这个普通演员不是失败了吗?

Java 为什么';这个普通演员不是失败了吗?,java,generics,casting,Java,Generics,Casting,我希望这段代码抛出ClassCastException: public class Generics { public static void main(String[] args) { method(Integer.class); } public static <T> T method(Class<T> t) { return (T) new String(); } } 公共类泛型{ 公共静态void

我希望这段代码抛出ClassCastException:

public class Generics {
    public static void main(String[] args) {
        method(Integer.class);
    }

    public static <T> T method(Class<T> t) {
        return (T) new String();
    }
}
公共类泛型{
公共静态void main(字符串[]args){
方法(Integer.class);
}
公共静态T方法(T类){
返回(T)新字符串();
}
}
但事实并非如此。将字符串强制转换为T不会失败,直到我以某种方式使用返回的对象,如:

public class Generics {
    public static void main(String[] args) {
        method(Integer.class).intValue();
    }

    public static <T> T method(Class<T> t) {
        return (T) new String();
    }
}
公共类泛型{
公共静态void main(字符串[]args){
方法(Integer.class).intValue();
}
公共静态T方法(T类){
返回(T)新字符串();
}
}
背景:我创建了一个类,它使用JAXB来解组XML文件。看起来是这样的:

public static <T> T unmarshal(File file, Class<? extends T> clazz)

public static T unmarshal(File File,Class如果未明确指定T,则类型擦除会将其视为
Object
。因此,可以将字符串对象强制转换…

如果未明确指定,则T为对象

因此,查找结果如下所示

public class Generics {

    public static void main(String[] args) {
        Generics.method(Integer.class).intValue();
    }

    public static Object method(Class<Object> t) {
        return (Object) new String();
    }
}
公共类泛型{
公共静态void main(字符串[]args){
泛型.method(Integer.class).intValue();
}
公共静态对象方法(t类){
返回(对象)新字符串();
}
}
如果指定常规参数:

public class Generics {

    public static void main(String[] args) {
        Generics.<Integer>method(Integer.class).intValue();
    }

    public static <T> T method(Class<T> t) {
        return (T) new String();
    }
}
公共类泛型{
公共静态void main(字符串[]args){
泛型.method(Integer.class).intValue();
}
公共静态T方法(T类){
返回(T)新字符串();
}
}

您将得到该异常。

我认为您可以创建更强大的方法定义,如下所示:

public static <T extends Number> T method(Class<T> t) {
    return //// some code.
}
公共静态T方法(T类){
返回///一些代码。
}
在这种情况下,无法编译行return new String()

但line return new Integer(123);是编译的,可以工作,不需要强制转换。

嗯,它确实会产生一个警告。