1. 文章引言
xxx类型
可以为如下类型:
-
我们自定义的类:
-
Student
类 -
Project
类 -
Person
类 -
…等等
-
-
基本变量的包装类:
-
int
的包装类Integer
-
long
的包装类Long
-
float
的包装类Float
-
…等等
-
-
字符串
String
类型
2. 复现错误
今天在写如下代码:
/**
* 测试getObject方法
*
* @author super先生
* @datetime 2023/2/23 20:43
*/
@Test
public void testGetObject() {
List<String> object = (List<String>) getObject();
for (String s : object) {
System.out.println(s);
}
}
/**
* 创建list集合
*
* @author super先生
* @datetime 2023/2/23 20:44
*/
private Object getObject() {
ArrayList<Object> list = new ArrayList();
list.add("tesOne");
list.add(2);
list.add("tesThree");
return list;
}
却报出如下错误:
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at com.superjson.superjsonmanager.CommonTest.testGetObject(CommonTest.java:106)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
......
3. 分析错误
java.lang.Integer cannot be cast to java.lang.String
翻译成中文是Integer类型无法转换成String类型
。
我们再次去看上述的错误截图,在绿框的上方打印出tesOne
。
那么,tesOne
来自于哪里呢?它来自于这条语句list.add("tesOne");
。
为什么打印出tesOne
后,就报出错误了呢?
我们再看这条语句list.add(2);
,它本身是没有问题的,哪里出现了问题呢?
问题出在这条语句List<String> object = (List<String>) getObject();
——该语句是将getObject()
方法的返回结果强制转成String
类型的集合。显然2
不是string
类型的,2
是int(Integer)
型。
那么,我们怎么修改呢?
4. 解决错误
既然无法将Integer
型转化为String
类型,我们就将2
修改成"2"
即可,如下代码所示:
输出结果如下图所示:
由输出结果可知,如此修改没有问题。
5. 文章结论
java.lang.ClassCastException: xxx类型 cannot be cast to xxx类型
:
-
前一个
xxx类型
是你实际值的类型 -
后一个
xxx类型
是你要强制转换成的类型
如果你实际值的类型和你强制转换成的类型不一致,就会报出这个错误,如上java.lang.Integer cannot be cast to java.lang.String
。
自定义的实体类,如果类型不一致,也会报出类似的错误。
比如,我定义两个类,分别为Student
类和Person
类,如下代码所示:
- 定义
Student
类
/**
* @author super先生
* @datetime 2023/2/24 13:51
* @desc 定义Student类
*/
@AllArgsConstructor
@Data
public class Student {
private Long id;
private String name;
}
- 定义
Person
类
/**
* @author super先生
* @datetime 2023/2/24 13:51
* @desc 定义Person类
*/
@AllArgsConstructor
@Data
public class Person {
private Long id;
private String name;
}
- 测试
Student
类转换成Person
类
package com.superjson.superjsonmanager.po;
/**
* @author super先生
* @datetime 2023/2/24 13:44
* @desc 测试Student和Person类。
*/
public class Test {
/**
* 定义一个方法,返回值Student的实例化对象,但返回类型是Object
*
* @author super先生
* @datetime 2023/2/24:13:47
* @return
*/
public Object getObj() {
return new Student(1L, "super先生");
}
public static void main(String[] args) {
Object obj = new Test().getObj();
Person person = (Person) obj;
System.out.println(person);
}
}
输出结果如下图:
即java.lang.ClassCastException: com.superjson.superjsonmanager.po.Student cannot be cast to com.superjson.superjsonmanager.po.Person
换句话说,Student
类型无法强制转换成Person
类型,故而报出这个错误。