关于java中的通用转换

时间:2014-04-07 03:27:22

标签: java generics types casting

在Java中,每个人都知道Integer不能转换为String,这在编译时是错误的。

现在对于这个通用案例,

        public <T> T cast(Object o) {
            return (T) Integer.class.cast(o);//cast Integer to T
        }

        void method1() {
            String q = cast("q"); //T is String
        }

我只是不明白为什么在这种情况下java不能在编译时警告你Integer被强制转换为String。为什么?在我的知识中,类型擦除是在编译之后发生的。

编辑:我只是认为编译器有类型推断知道T是String,因此无法强制转换为Integer。但显然它不是。

1 个答案:

答案 0 :(得分:5)

有了这个

public <T> T cast(Object o) {
     return (T) Integer.class.cast(o);//cast Integer to T
}

你声明一个无界的类型变量T,即。它可以是任何引用类型。因此castInteger可能有用,也可能没有。

所有编译器都能做的就是警告你

  

类型安全:取消选中从Integer转换为T

相反,如果你给了类型变量的界限,比如

public <T extends CharSequence> T cast(Object o) {
    return (T) Integer.class.cast(o); // Cannot cast from Integer to T
}

那么你会得到一个编译错误,因为CharSequenceInteger不在同一个继承层次结构中,因此不兼容。

在这种特定情况下,即使没有强制转换为T,您也会收到编译错误。这是因为

AnyTypeName.class 

始终返回Class<ThatTypeName>Class#cast使用泛型类型。在这种情况下,它会返回IntegerInteger无法转换为T