为何Arrays.deepEquals和deepToString支持多维基本类型数组却不支持一维?
关于Arrays.deepEquals与Arrays.deepToString的参数兼容问题
从方法签名可知,Arrays.deepEquals(Object[] arr1, Object[] arr2) 和 Arrays.deepToString(Object[]) 方法接受Object[]类型参数,但它们能完美支持int[][]、float[][]等多维基本类型数组,却对int[]、float[]等一维基本类型数组报错。
示例1:deepEquals支持多维数组
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
示例2:deepEquals不支持一维数组
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存在同样问题
示例3:deepToString支持多维数组
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]]
示例4:deepToString不支持一维数组
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子类型规则以辅助理解
- Java中的子类型:子类型是面向对象编程语言的关键特性,若S继承或实现T,则S是T的子类型,且子类型具有传递性。例如
String是Object的子类型,但int等基本类型不是任何引用类型的子类型。 - 数组类型的子类型规则:
- 若S和T均为引用类型,则
S[]是T[]的直接子类型当且仅当S是T的直接子类型; Object、Cloneable、java.io.Serializable是Object[]的直接超类型;- 若P是基本类型,则
Object、Cloneable、java.io.Serializable是P[]的直接超类型;
- 若S和T均为引用类型,则
- 数组类型的直接超类是
Object; - 所有数组类型都实现
Cloneable和java.io.Serializable接口; - Java中数组是对象,可赋值给
Object类型变量,可调用Object类的所有方法; - 对象指类实例或数组;
- 引用值是指向对象的指针,还有特殊的null引用;
- 类实例通过类实例创建表达式显式创建;
- 数组通过数组创建表达式显式创建。
内容的提问来源于stack exchange,提问作者Anand Pandey
相关产品推荐
相关产品推荐

