String.valueOf()当我尝试使用泛型方法的返回值作为方法参数时<T> T testMet1(int a),出现错误:
线程“main”中的异常 java.lang.ClassCastException:类 java.lang.Integer 无法转换为类 [C(java.lang.Integer 和 [C 位于加载器“bootstrap”的模块 java.base 中) (测试.java:4)`
来源:
class test {
public static void main(String[] args) {
test2 tstOb = new test2();
String tstStr = String.valueOf(tstOb.testMet1(1));
}
}
class test2 {
@SuppressWarnings("unchecked")
<T> T testMet1(int a) {
Integer tstInt = 5;
return (T) tstInt;
}
}
<T> T testMet1(int a)通过运行以下代码可以了解该方法返回的内容:
class test {
public static void main(String[] args) {
test2 tstOb = new test2();
Class tstCl = tstOb.testMet1(1).getClass();
System.out.print(tstCl);
}
}
class test2 {
@SuppressWarnings("unchecked")
<T> T testMet1(int a) {
Integer tstInt = 5;
return (T) tstInt;
}
}
执行结果如下:
类 java.lang.Integer
因此,该方法String.valueOf(tstOb.testMet1(1))将类型的对象Integer作为参数,并且应该像直接传递给定对象一样表现,但这并没有发生。
泛型方法总是返回一个对象,而不是原始类型。在所有重载中,
String.valueOf只有两个适用于对象:编译器必须选择其中之一。根据规则,它选择最具体的类型 - 它是
char[]。您收到一个强制转换Integer错误char[]。您可以通过明确指定所需的类型 (
Object) 来修复它:PS自动解包在特定目标类型已知时起作用。在特定目标类型未知的情况下
String.valueOf(许多重载),将不会自动拆箱。在这种情况下,泛型类型
<T>用于类实例方法test2,但编译器仍然不知道类型本身。您可以指定该类
test2是通用的并创建一个原始实例,如初始代码所示:在非泛型类中调用方法时,您还可以指定任何类型(除了):
char[]事实上,这种类型只是编译器需要的,不会执行强制转换,而是调用泛型方法
String.valueOf(Object o),而不是在数组上char[]。