为什么将多维数组放入可变参数会导致编译器警告?

Why does putting a multidimensional array in varargs cause a compiler warning?

我有一个非常简单的非空检查器,它有一个对象类型的可变参数

public static void nonNull(Object... objects) { //... }

当我用任何类型的多维数组调用它时,例如:

nonNull(new int[][] {})

nonNull(new Object[][] {})

它会导致编译器警告说 "Inexact type match for varargs"。它也发生在二维以上的数组中。

示例未出现警告:

nonNull(new Object[] {})

nonNull(new Object())

我只是好奇为什么。多维数组只是另一个对象,就像常规数组一样,不是吗?那么为什么类型匹配不准确?

如果您向可变参数方法提供单个 Object[],它将直接用作 objects 参数,而不是包装在长度为 1 的数组中。

new int[][]{}new Object[][]{} 在技术上 由于数组协方差, 算作 Object[] 类型。

因此,对于 nonNull(new int[][] {})nonNull(new Object[][] {}),您提供的数组将直接用作 objects,而不是作为长度为 1 的唯一元素传递 Object[].

很可能您不希望这种情况发生,因此 Java 就此向您发出警告。