Java 1.8编译器为何选char[]调用String.valueOf引发类型转换异常?
问题分析:为何编译器选择
String.valueOf(char[])而非String.valueOf(int) 先看你的代码场景:泛型方法get()返回<T> T,在main中调用String.valueOf(get("int"))时,编译器将get()的返回值强转为char[],导致运行时抛出ClassCastException,而非匹配接受int的重载方法。
原因可以拆解为两点:
1. 泛型类型参数只能是引用类型
Java泛型不支持基本类型,所以泛型方法get()的返回类型T只能被推断为引用类型。而String.valueOf(int)的参数是基本类型int,无法和T(引用类型)匹配,因此编译器直接排除了这个重载选项。
2. 重载解析优先选择更具体的方法
在剩下的接受引用类型的String.valueOf重载中(比如valueOf(char[])、valueOf(Object)),编译器遵循重载解析的"最具体匹配"规则:
char[]是Object的子类,所以valueOf(char[])比valueOf(Object)更具体- 编译器会优先选择这个更具体的重载方法,因此推断
T的类型为char[],并在字节码中插入(char[])的强制类型转换
运行时,get("int")实际返回的是Integer对象,无法转换为char[],自然抛出ClassCastException。
如果想要调用String.valueOf(int),可以显式指定泛型类型或者手动转换:
// 显式指定泛型类型为Integer,再自动拆箱为int String.valueOf(Test.<Integer>get("int")); // 或者手动转换类型 String.valueOf((int) get("int"));
内容的提问来源于stack exchange,提问作者thy-code
相关产品推荐
相关产品推荐

