Если у меня есть Java-метод vararg foo(Object ...arg)
и я вызываю foo(null, null)
, у меня есть оба arg[0]
и arg[1]
как null
s. Но если я позвоню foo(null)
, arg
само будет null. Почему это происходит?
Как мне называть foo
такое, что foo.length == 1 && foo[0] == null
есть true
?
null
language-design
java
variadic-functions
патикрит
источник
источник
asList
метод в образце и его цель.asList()
- статический импорт изjava.util.Arrays
класса. Я просто решил, что это очевидно. Хотя теперь, когда я думаю об этом, мне, вероятно, следовало просто использовать,Arrays.toString()
поскольку единственная причина, по которой он преобразуется в список, - это то, что он будет печатать красиво.Вам нужно явное приведение к
Object
:В противном случае предполагается, что аргумент представляет собой весь массив, который представляет varargs.
источник
Тестовый пример, чтобы проиллюстрировать это:
Код Java с объявлением метода приема vararg (который оказывается статическим):
Этот код Java (тестовый пример JUnit4) вызывает вышеизложенное (мы используем тестовый пример, чтобы ничего не тестировать, а просто для генерации некоторого вывода):
Выполнение этого как теста JUnit дает:
Чтобы сделать это более интересным, давайте вызовем
receive()
функцию из Groovy 2.1.2 и посмотрим, что произойдет. Оказывается, результаты разные! Хотя это может быть ошибкой.Выполнение этого как теста JUnit дает следующее, с отличием от Java, выделенным жирным шрифтом.
источник
Это связано с тем, что метод varargs может быть вызван с реальным массивом, а не с серией элементов массива. Когда вы предоставляете ему неоднозначное
null
само по себе, он предполагает, чтоnull
это файлObject[]
. Кастингnull
ToObject
будет это исправить.источник
я предпочитаю
чтобы избежать исключений нулевого указателя.
Надеюсь, поможет.
источник
foo()
?Порядок разрешения перегрузки метода следующий ( https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.12.2 ):
foo(null)
совпадаетfoo(Object... arg)
сarg = null
в первой фазе.arg[0] = null
будет третья фаза, которой никогда не бывает.источник