【问题标题】:Why does putting a multidimensional array in varargs cause a compiler warning?为什么将多维数组放入可变参数会导致编译器警告?
【发布时间】:2017-05-05 19:05:16
【问题描述】:

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

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

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

nonNull(new int[][] {})

nonNull(new Object[][] {})

它会导致编译器警告说“可变参数的类型匹配不精确”。它也发生在超过 2 维的数组中。

例如,警告不会出现:

nonNull(new Object[] {})

nonNull(new Object())

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

【问题讨论】:

  • 顺便说一下,Java 确实提供了一个Objects.requireNonNull 方法。事实上,其中三个。
  • 是的,我知道,但我制作了一个版本,用于传递对象数组而不是单个对象

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 哦,我想我明白了!因此,如果我传入一个 int[][] 方法,则传入 int 数组内的嵌套 int 数组而不是实际的 int[][] 对象?
猜你喜欢
  • 1970-01-01
  • 2019-06-17
  • 2013-04-03
  • 1970-01-01
  • 2016-06-15
  • 2018-03-31
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多