为什么将多维数组放入可变参数会导致编译器警告?
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 就此向您发出警告。
我有一个非常简单的非空检查器,它有一个对象类型的可变参数
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 就此向您发出警告。