为什么在varargs中放置多维数组会导致编译器警告?

时间:2017-05-05 19:05:17

标签: java multidimensional-array parameter-passing compiler-warnings variadic-functions

我有一个非常简单的非null检查器,它有一个类型为Object

的varargs参数

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

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

nonNull(new int[][] {})

nonNull(new Object[][] {})

它会导致编译器警告说"不合适类型匹配varargs"。它也适用于超过2维阵列。

示例中没有显示警告:

nonNull(new Object[] {})

nonNull(new Object())

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

1 个答案:

答案 0 :(得分:1)

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

由于数组协方差,new int[][]{}new Object[][]{}技术上都计为Object[] 类型。

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

很可能你并不希望这种情况发生,所以Java会给你一个警告。