从方法签名可以很清楚地看出,方法接受Object[]类型的参数,但此方法仍然可以很好地用于原始多维数组?(如int[][]、Float[][]等) (但是,对于原始一维数组(如int[]、Float[]等),它会显示错误)

例:

      int[][]arr=new int[2][3];
      arr[0][0]=1;
      arr[0][1]=2;
      arr[0][2]=3;
      arr[1][0]=4;
      arr[1][1]=5;
      arr[1][2]=6;
      int[][]arr1=new int[2][3];
      arr1[0][0]=1;
      arr1[0][1]=2;
      arr1[0][2]=3;
      arr1[1][0]=4;
      arr1[1][1]=5;
      arr1[1][2]=6;

      System.out.println(Arrays.deepEquals(arr,arr1));

      Output: true


例:  
     int[]arr={1,2,3,4,5};
     int[]arr1={1,2,3,4,5};
     System.out.println(Arrays.deepEquals(arr,arr1));//Error
/*"The method deepEquals(Object[], Object[]) in the type Arrays is not applicable for the arguments (int[], int[])"*/

方法签名中的Arrays.DeeptoString(Object[])也存在同样的问题.很明显,此方法也接受类型Object[]的参数,但对于原始多维数组(如int[][],Float[][]等),它仍然工作得很好(但对于原始一维数组(如int[],Float[]等),它显示错误).

  例:
      int[][]arr=new int[2][3];
      arr[0][0]=1;
      arr[0][1]=2;
      arr[0][2]=3;
      arr[1][0]=4;
      arr[1][1]=5;
      arr[1][2]=6;

      System.out.println(Arrays.deepToString(arr));

      Output: [[1, 3, 0], [4, 5, 6]]


 例:

     int[]arr={1,2,3,4,5}; 
     System.out.println(Arrays.deepToString(arr)); //Error
    //"The method deepToString(Object[]) in the type Arrays is not applicable for the arguments (int[])"

推荐答案

这是子类型和多维数组类型在Java中工作方式的结果.

例如,类型int[][]实际上是"int的数组的数组"."int的数组"部分是基元数组类型.

根据Java子类型规则,所有数组(包括int[]等一维原始数组)都是Object的子类型.这意味着int[][]("int的数组")是Object[]("Object的数组")的子类型.

相比之下,int[]不是Object[]的子类型,因为int不是Object的子类型.

这意味着Arrays.deepEquals不适用于基元数组(即该方法不适用于参数),但它适用于arrays of个基元数组;即多维基元array.实际的解决方案是在比较一维原始数组时使用Arrays.equals重载.

Java相关问答推荐

收听RDX中用户数据的变化

将偶数元素移动到数组的前面,同时保持相对顺序

在AnyLogic中增加变量计数

解析Javadoc时链接的全限定类名

获取字符串中带空格的数字和Java中的字符

当涉及到泛型时,类型推理在Java中是如何工作的?

这是什么Java构造`(InputStream Is)->;()->;{}`

JavaFX如何在MeshView中修复多个立方体?

Bean定义不是从Spring ApplationConext.xml文件加载的

MimeMessage emlMessage=new MimeMessage(Session,emlInputStream);抛出InvocationTargetException

如何在我的世界中为互动增加冷却时间?

如何在太阳系模拟器中添加月球?

Spring Validator批注不起作用

如何在SWT菜单项文本中保留@字符

在Oracle中调用输出参数在索引处缺少IN或OUT参数的函数

Java类型推断:为什么要编译它?

在Spring Boot中使用咖啡因进行缓存

使用同步方法中的新线程调用同步方法

谷歌应用引擎本地服务器赢得';t在eclipse上运行

如何使用Hibernate v6.2构建NamingStrategy,以表名作为所有列的前缀?