我有一个非常简单的非null检查器,它有一个类型为Object
的varargs参数 public static void nonNull(Object... objects) {
//...
}
当我使用任何类型的多维数组调用它时,例如:
nonNull(new int[][] {})
或
nonNull(new Object[][] {})
它会导致编译器警告说"不合适类型匹配varargs"。它也适用于超过2维阵列。
示例中没有显示警告:
nonNull(new Object[] {})
或
nonNull(new Object())
我只是好奇为什么。多维数组只是另一个对象,就像常规数组一样吗?那么为什么类型匹配不精确呢?
答案 0 :(得分:1)
如果为varargs方法提供单个Object[]
,它将直接用作objects
参数,而不是包含在length-1数组中。
由于数组协方差,new int[][]{}
和new Object[][]{}
技术上都计为Object[]
类型。
因此,对于nonNull(new int[][] {})
和nonNull(new Object[][] {})
,您提供的数组将直接用作objects
,而不是作为长度为1 {{1}的唯一元素传递}}