关于Object数组强转成Integer数组的问题:Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
一、当把Object数组,强转的具体的Integer数组时,会报错。
代码如下:
//数组强转报错演示
Object[] numbers = {1,2,3};
Integer[] ints = (Integer[])numbers;
报错:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
原因:
根本原因还是类型的继承关系问题,Integer[]并不是Object[]的子类。虽然,Integer继承自Object,但Integer[]的直接父类是Object。即所有数组类型的直接父类都是Object,可以通过反射来验证。数组类型是写在jvm里得,就像8种基本类型,我们无法在java的标准库中找到这个类。
//数组的直接父类演示
@Test
public void testArrayClass() {
Integer[] i = {1,2,3};
Object[] o = {1,2,3};
System.out.println(o.getClass().getSuperclass().getName());
System.out.println(i.getClass().getSuperclass().getName());
}
输出结果:
java.lang.Object
java.lang.Object
解决方案,可以对数组每个成员分别转化:
@Test
public void testArrayChange() {
Object[] numbers = {1,2,3};
Integer[] ints = new Integer[numbers.length];
for(int i = 0;i<numbers.length;i++) {
ints[i] = (Integer)numbers[i];
}
}
二、另外:虽然强转会有类型转换异常,但是,java有一个语法特性:
当A被B继承时,A[]类型的引用可以指向B[]类型的实例.
即:A[] a = new B[3]成立。
@Test
public void testArrayClass() {
Integer[] i = {1,2,3};
Object[] o = i;
System.out.println("引用成功!!");
}
控制台:
引用成功!!
这种情况被允许,是java的一个语法特性,这种语法特性的存在是为了方法中参数传递的方便。
在给数据库语句传递参数时,将多个参数传递给sql语句中的每一个占位符,可以使用Object[]类型的参数来接收,然后,在方法中遍历数组元素,根据不同类型,转化成相应的类型数据。
@Test
public void testTraversalObject() {
Integer[] a = {1,2,3};
String[] b = {"a","b","c"};
traversalArray(a);
traversalArray(b);
} public void traversalArray(Object[] o) {
for(int i = 0;i<o.length;i++) {
if(o[i] instanceof Integer) {
System.out.println("PreparedStatement添加int参数");
}
if(o[i] instanceof String) {
System.out.println("PreparedStatement添加String参数");
}
if(o[i] instanceof java.util.Date) {
System.out.println("PreparedStatement添加String参数");
}
else {
System.out.println("还有其他类型得意添加!");
}
}
}
如果没有这个特性:
1、在方法中定义Object类型的参数,来接收数组参数,如果在代码内部进行类型转化,则有类型转化异常的风险,因为,Object是顶级父类,传递的参数可以不是个数组
Object obj = 1;
Object[] objs = (Object[]) obj;
2、使用具体的数据类型数组,String[],Integer[],则会使类型的限制太过固定失去灵活性,每种类型都要新增一个方法来代替。
@Test
public void testTraversalObject() {
Integer[] a = {1,2,3};
String[] b = {"a","b","c"};
traversalIntegerArray(a);
traversalStringArray(b);
} public void traversalIntegerArray(Integer[] arr) {
for(int i = 0;i<arr.length;i++) {
//给PreparedStatement添加参数
}
}
public void traversalStringArray(String[] arr) {
for(int i = 0;i<arr.length;i++) {
//给PreparedStatement添加参数
}
}
}
关于Object数组强转成Integer数组的问题:Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;的更多相关文章
- 关于Object[]数组强转成Integer[]类型的数组.
为什么不能由Object[]数组强转成Integer[]数组. Object[] ins= { new Integer(0), new Integer(1), new Integer(2), new ...
- java.lang.ClassCastException: java.lang.Short cannot be cast to java.lang.String(Short类型无法强转成String类型)
有一行Java代码如下: String code1 = (String)qTable1.getValueAt(i, 0); 这是一个Java的图形界面获取表格中值的代码,其中qTable1.getVa ...
- ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]
错误堆栈: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[] at android ...
- java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
hibernate查询结果条数集 原写法: Integer count = (Integer )session.createQuery(hql).uniqueResult(); 报错:java.lan ...
- java.lang.Long cannot be cast to java.lang.Integer解决办法
情景: mybatis连接oracle 报错: 测试增的时候,报错 Java.lang.Long cannot be cast to java.lang.Integer:删改没有报错. 排查过程: ...
- PHP二维数组(或任意维数组)转换成一维数组的方法汇总(实用)
目录 1 array_reduce函数法 2 array_walk_recursive函数法 3 array_map函数法 假设有下面一个二维数组: $user = array( '0' => ...
- PHP实现二维数组(或多维数组)转换成一维数组
1 array_reduce函数法 用array_reduce()函数是较为快捷的方法: $result = array_reduce($user, function ($result, $value ...
- js 一维数组,转成嵌套数组
// 情况一: // 数据源var egs = [ {name_1: 'name_1...'}, {name_2: 'name_4...'}, {name_3: 'name_3...'}, {name ...
- Java中 如何把Object类型强转成Map<String, String>类型
首先你需要保证要转换的Object的实际类型是Map<String, String> 假设Object变量名为obj,强制转换(Map<String, String>)obj ...
随机推荐
- Kali学习笔记36:AVWS10的使用
AVWS是一款商业Web扫描工具 适用于Windows操作系统 功能强大,必须掌握 AVWS11以上是Web形式,AVWS10是桌面应用形式 下载安装破解这些基本操作就不说了,百度即可 从安装好开始: ...
- Kali学习笔记12:服务扫描
关于什么是服务扫描不多介绍,通俗来看: 我已经扫描到目标机器某个端口开放,接下来我需要知道开放这个端口的是什么应用 情景: 我的Kali机器IP地址:192.168.22.130 我要扫描的Metas ...
- 安卓视频播放器(VideoView)
VideoView是安卓自带的视频播放器类,该类集成有显示和控制两大部分,在布局文件中添加VideoView然后在java文件中简单的调用控制命令,即可实现本地或者网络视频的播放.本章实现视频的居中播 ...
- 运维笔记--ubuntu rm删除文件后 恢复
待补充 特别注意:umount分区,尝试恢复文件,文件夹(目录),全部文件 https://www.cnblogs.com/wangxiaoqiangs/p/5630288.html https:// ...
- Nacos发布0.5.0版本,轻松玩转动态 DNS 服务
阿里巴巴微服务开源项目Nacos于近期发布v0.5.0版本,该版本主要包括了DNS-basedService Discovery,对Java 11的支持,持续优化Nacos产品用户体验,更深度的与Sp ...
- (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)
在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机 前提:服务器端安装桌面版的centos系统 CentOS Linux release 7.5.1804 (Core) ...
- 流式大数据计算实践(1)----Hadoop单机模式
一.前言 1.从今天开始进行流式大数据计算的实践之路,需要完成一个车辆实时热力图 2.技术选型:HBase作为数据仓库,Storm作为流式计算框架,ECharts作为热力图的展示 3.计划使用两台虚拟 ...
- Python获得百度统计API的数据并发送邮件
Python获得百度统计API的数据并发送邮件 小工具 本来这么晚是不准备写博客的,当是想到了那个狗子绝对会在开学的时候跟我逼逼这个事情,所以,还是老老实实地写一下吧. Baidu统计API的使 ...
- Go标准库:深入剖析Go template
本文只关注Go text/template的底层结构,带上了很详细的图片以及示例帮助理解,有些地方也附带上了源码进行解释.有了本文的解释,对于Go template的语法以及html/template ...
- OJ:又一道考察多态的题目
Description 下面的程序输出结果是: A::Fun A::Do A::Fun C::Do 请填空: 程序代码如下 #include <iostream> using namesp ...