一、当把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;的更多相关文章

  1. 关于Object[]数组强转成Integer[]类型的数组.

    为什么不能由Object[]数组强转成Integer[]数组. Object[] ins= { new Integer(0), new Integer(1), new Integer(2), new ...

  2. 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 ...

  3. 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 ...

  4. java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer

    hibernate查询结果条数集 原写法: Integer count = (Integer )session.createQuery(hql).uniqueResult(); 报错:java.lan ...

  5. java.lang.Long cannot be cast to java.lang.Integer解决办法

    情景: mybatis连接oracle 报错: 测试增的时候,报错 Java.lang.Long cannot be cast to  java.lang.Integer:删改没有报错. 排查过程: ...

  6. PHP二维数组(或任意维数组)转换成一维数组的方法汇总(实用)

    目录 1 array_reduce函数法 2 array_walk_recursive函数法 3 array_map函数法 假设有下面一个二维数组: $user = array( '0' => ...

  7. PHP实现二维数组(或多维数组)转换成一维数组

    1 array_reduce函数法 用array_reduce()函数是较为快捷的方法: $result = array_reduce($user, function ($result, $value ...

  8. js 一维数组,转成嵌套数组

    // 情况一: // 数据源var egs = [ {name_1: 'name_1...'}, {name_2: 'name_4...'}, {name_3: 'name_3...'}, {name ...

  9. Java中 如何把Object类型强转成Map<String, String>类型

    首先你需要保证要转换的Object的实际类型是Map<String, String> 假设Object变量名为obj,强制转换(Map<String, String>)obj ...

随机推荐

  1. [转载]PHP中PSR-[0-4]规范

      PHP是世界上最伟大的语言,这一点是毋庸置疑的吧.哈哈哈哈哈哈 .这个霸气的开头不错!(^__^) 但是正是因为伟大,所以用的人也就多了,人一多,再牛逼再伟大的东西,都会产生问题,逐渐就造成了很多 ...

  2. MapReduce实现ReduceSideJoin操作

    本文转载于:http://blog.csdn.net/xyilu/article/details/8996204 一.准备两张表以及对应的数据 (1)m_ys_lab_jointest_a(以下简称表 ...

  3. npm包实现发布正式和测试版

    npm publish的時候 怎麽發測試版和正式版本呢? 通常我們一般情況下 直接 npm publish 提交自己的開發包后,在項目中 npm install @packageName 是下載下來剛 ...

  4. Salesforce Sales Cloud 零基础学习(一) Product 和 Price Book

    以前的博客大部分都是基于force.com以及lightning展开的自定义开发,其实salesforce提供了很多的标准的功能以及平台, Sales Cloud便是作为Salesforce核心的平台 ...

  5. [CXF REST标准实战系列] 一、JAXB xml与javaBean的转换

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points: 1.不认识到犯错,然后得到 ...

  6. 代理模式(静态代理、JDK动态代理原理分析、CGLIB动态代理)

    代理模式 代理模式是设计模式之一,为一个对象提供一个替身或者占位符以控制对这个对象的访问,它给目标对象提供一个代理对象,由代理对象控制对目标对象的访问. 那么为什么要使用代理模式呢? 1.隔离,客户端 ...

  7. redis学习总结-redis作为MyBatis的自定义缓存

    1.RedisCache.java package com.houtai.cache; import java.util.concurrent.locks.ReadWriteLock; import ...

  8. vue路由对不同界面进行传参及跳转的总结

    最近在做一个公众号的商城项目,主要用的VUE+MUI,其实今天这个点对于有过项目经验的前端工作者来说是最基础的,但也是必须要掌握的,今天小编主要是记录下传参和跳转的一些总结(仅供参考). 首先我们先上 ...

  9. linux 命令 — cut

    cut 以列的方式格式化输出 依赖定界符 cut -f field_list filename 以默认定界符(tab,制表符)分割文件的列,输出指定的列field_list,field_list由列号 ...

  10. 最好用的编辑器之一:Vim-Go环境搭建

    本文由Librant发表 如果说在Linux环境下,什么编辑器最好用,如果我说是VIM,估计会有一大部分人嗤之以鼻,怎么可能.VIM可能是他用过众多编辑器最难用的一个.在我司用的是云虚拟机,说实话吧, ...