欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于Object数组强转成Integer数组的问题:Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;

程序员文章站 2022-07-05 15:28:33
一、当把Object数组,强转的具体的Integer数组时,会报错。 代码如下: //数组强转报错演示 Object[] numbers = {1,2,3}; Integer[] ints = (Integer[])numbers; 报错: 报错: 原因: 根本原因还是类型的继承关系问题,Integ ......

一、当把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添加参数
     }
   } 
}