在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。但显然它不是。
答案 0 :(得分:5)
有了这个
public <T> T cast(Object o) {
return (T) Integer.class.cast(o);//cast Integer to T
}
你声明一个无界的类型变量T
,即。它可以是任何引用类型。因此cast
到Integer
可能有用,也可能没有。
所有编译器都能做的就是警告你
类型安全:取消选中从Integer转换为T
相反,如果你给了类型变量的界限,比如
public <T extends CharSequence> T cast(Object o) {
return (T) Integer.class.cast(o); // Cannot cast from Integer to T
}
那么你会得到一个编译错误,因为CharSequence
和Integer
不在同一个继承层次结构中,因此不兼容。
在这种特定情况下,即使没有强制转换为T
,您也会收到编译错误。这是因为
AnyTypeName.class
始终返回Class<ThatTypeName>
,Class#cast
使用泛型类型。在这种情况下,它会返回Integer
而Integer
无法转换为T
。