Jika saya memiliki metode Java vararg foo(Object ...arg)
dan saya memanggil foo(null, null)
, saya memiliki keduanya arg[0]
dan arg[1]
sebagai null
s. Tetapi jika saya menelepon foo(null)
, arg
itu sendiri adalah nol. Mengapa ini terjadi?
Bagaimana saya harus menelepon foo
sehingga foo.length == 1 && foo[0] == null
adalah true
?
null
language-design
java
variadic-functions
pathikrit
sumber
sumber
asList
metode dalam sampel, dan tujuannya.asList()
adalah impor statis darijava.util.Arrays
kelas. Saya hanya berasumsi bahwa itu sudah jelas. Meskipun sekarang saya memikirkannya, saya mungkin seharusnya hanya menggunakanArrays.toString()
karena satu-satunya alasan itu diubah menjadi Daftar adalah agar itu akan dicetak dengan cantik.Anda membutuhkan pemeran eksplisit untuk
Object
:Jika tidak, argumennya diasumsikan sebagai seluruh larik yang diwakili oleh vararg.
sumber
Kasus Uji untuk menggambarkan ini:
Kode Java dengan deklarasi metode pengambilan vararg (yang kebetulan statis):
Kode Java ini (kasus uji JUnit4) memanggil yang di atas (kami menggunakan kasus uji untuk tidak menguji apa pun, hanya untuk menghasilkan beberapa keluaran):
Menjalankan ini sebagai pengujian JUnit menghasilkan:
Untuk membuatnya lebih menarik, panggil
receive()
fungsi dari Groovy 2.1.2 dan lihat apa yang terjadi. Ternyata hasilnya tidak sama! Ini mungkin bug.Menjalankan ini sebagai pengujian JUnit menghasilkan yang berikut, dengan perbedaan pada Java yang disorot dalam huruf tebal.
sumber
Ini karena metode varargs bisa dipanggil dengan larik aktual daripada serangkaian elemen larik. Saat Anda memberikan ambigu
null
dengan sendirinya, ini mengasumsikan bahwanull
adalahObject[]
. Mentransmisikannull
keObject
akan memperbaiki ini.sumber
saya lebih memilih
untuk menghindari pengecualian pointer Null.
Semoga membantu.
sumber
foo()
?Urutan resolusi kelebihan metode adalah ( https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.12.2 ):
foo(null)
cocokfoo(Object... arg)
denganarg = null
di fase pertama.arg[0] = null
akan menjadi fase ketiga, yang tidak pernah terjadi.sumber