Java 2d int数组是不是通用的?为什么?

use*_*158 1 java arrays generics types

我知道原始ints(int[] arr = new int[5])的Java数组不被视为通用对象,因此它不能作为参数提供给任何一个Arrays.sort(T[] a, Comparator<? super T> c)ArrayList.toArray(T[] a).

但是我刚发现2d原始整数数组可以作为上述方法的参数!代码如下.

int[][] points = new int[3][3];
Arrays.sort(points, (a, b) -> a[1] - b[1]);

List<int[]> list2 = new ArrayList<>();
list2.add(new int[]{1,3,5});
list2.add(new int[]{2});
int[][] array2 = list2.toArray(new int[5][5]);
for(int[] i : array2)
  System.out.println(Arrays.toString(i));
Run Code Online (Sandbox Code Playgroud)

怎么可能?是因为2d int数组被视为原始int数组的数组,其中内部数组本身不是原始数组?这种行为背后的设计是什么?

Mar*_*arv 5

Arrays::sort与许多其他接受泛型类型的方法一样,重载以支持基本类型,请参阅JavaDocs.事实上,有18种变体Arrays::sort:

static void sort(byte[] a)
static void sort(byte[] a, int fromIndex, int toIndex)
static void sort(char[] a)
static void sort(char[] a, int fromIndex, int toIndex)
static void sort(double[] a)
static void sort(double[] a, int fromIndex, int toIndex)
static void sort(float[] a)
static void sort(float[] a, int fromIndex, int toIndex)
static void sort(int[] a)
static void sort(int[] a, int fromIndex, int toIndex)
static void sort(long[] a)
static void sort(long[] a, int fromIndex, int toIndex)
static void sort(Object[] a)
static void sort(Object[] a, int fromIndex, int toIndex)
static void sort(short[] a)
static void sort(short[] a, int fromIndex, int toIndex)
static <T> void sort(T[] a, Comparator<? super T> c)
static <T> void sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,除了采用Comparators的所有这些都被重载以接受所有基元以及通用数组类型.

至于为什么static <T> void sort(T[] a, Comparator<? super T> c)接受类型的对象int[][],而不是类型的对象int[]:int[][]是一个数组int[],它是一种扩展的类型Object,不像int.int[][]是一个对象数组,而不是一个基元数组.