为什么将多维阵列放入Varargs会引起编译器警告



我有一个非常简单的不是null检查器,该检查器具有类型对象的varargs参数

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

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

nonNull(new int[][] {})

nonNull(new Object[][] {})

它导致编译器警告说" varargs的不精确类型匹配"。它也发生在2个以上的数组中。

警告没有显示示例:

nonNull(new Object[] {})

nonNull(new Object())

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

如果向varargs方法提供单个Object[],它将直接用作objects参数,而不是包裹在长度-1数组中。

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

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

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

最新更新