Java 为什么';这个普通演员不是失败了吗?
我希望这段代码抛出ClassCastException: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
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);是编译的,可以工作,不需要强制转换。嗯,它确实会产生一个警告。