Saya ingin dapat membuat fungsi seperti:
class A {
private String extraVar;
public String myFormat(String format, Object ... args){
return String.format(format, extraVar, args);
}
}
Masalahnya di sini adalah bahwa args
diperlakukan sebagai Object[]
dalam metode myFormat
, dan dengan demikian merupakan satu argumen untuk String.format
, sementara saya ingin setiap satu Object
di args
akan disahkan sebagai argumen baru. Karena String.format
juga merupakan metode dengan argumen variabel, ini harus dimungkinkan.
Jika ini tidak mungkin, apakah ada metode seperti String.format(String format, Object[] args)
? Dalam hal ini saya bisa tambahkan extraVar
untuk args
menggunakan array baru dan menyebarkannya ke metode tersebut.
java
arrays
backwards-compatibility
variadic-functions
pengguna362382
sumber
sumber
Jawaban:
Jenis metode variadic yang mendasarinya
function(Object... args)
adalahfunction(Object[] args)
. Sun menambahkan vararg dengan cara ini untuk menjaga kompatibilitas.Jadi Anda hanya harus dapat tambahkan
extraVar
keargs
dan panggilanString.format(format, args)
.sumber
X[]
ke dalam metodex(X... xs)
memberikan peringatan berikut dalam Eclipse:Type X[] of the last argument to method x(X...) doesn't exactly match the vararg parameter type. Cast to X[] to confirm the non-varargs invocation, or pass individual arguments of type X for a varargs invocation.
Ya, a
T...
hanya gula sintaksis untuk aT[]
.JLS 8.4.1 Format parameter
Berikut ini contoh untuk diilustrasikan:
Dan ya,
main
metode di atas valid, karena sekali lagi,String...
adilString[]
. Juga, karena array adalah kovarian, aString[]
adalahObject[]
, jadi Anda juga dapat memanggilezFormat(args)
keduanya.Lihat juga
Varargs mengerti # 1: passing
null
Cara vararg diselesaikan cukup rumit, dan terkadang melakukan hal-hal yang mungkin mengejutkan Anda.
Pertimbangkan contoh ini:
Karena bagaimana varargs diselesaikan, pernyataan memanggil terakhir dengan
objs = null
, yang tentu saja akan menyebabkanNullPointerException
denganobjs.length
. Jika Anda ingin memberikan satunull
argumen ke parameter varargs, Anda dapat melakukan salah satu dari berikut ini:Pertanyaan-pertanyaan Terkait
Berikut ini adalah contoh dari beberapa pertanyaan yang diajukan orang ketika berurusan dengan varargs:
Vararg Gotchas # 2: menambahkan argumen tambahan
Seperti yang Anda ketahui, yang berikut ini tidak "bekerja":
Karena cara kerja varargs,
ezFormat
sebenarnya ada 2 argumen, yang pertama adalah aString[]
, yang kedua adalah aString
. Jika Anda meneruskan array ke varargs, dan Anda ingin elemen-elemennya dikenali sebagai argumen individual, dan Anda juga perlu menambahkan argumen tambahan, maka Anda tidak punya pilihan selain membuat array lain yang mengakomodasi elemen tambahan.Berikut adalah beberapa metode penolong yang berguna:
Sekarang Anda dapat melakukan hal berikut:
Varargs gotchas # 3: melewati sebuah array primitif
Itu tidak "bekerja":
Varargs hanya berfungsi dengan tipe referensi. Autoboxing tidak berlaku untuk array primitif. Karya-karya berikut:
sumber
X[]
ke dalam metodex(X... xs)
memberikan peringatan berikut dalam Eclipse:Type X[] of the last argument to method x(X...) doesn't exactly match the vararg parameter type. Cast to X[] to confirm the non-varargs invocation, or pass individual arguments of type X for a varargs invocation.
Tidak apa-apa untuk melewatkan array - pada kenyataannya itu sama dengan hal yang sama
sama dengan
Ini hanya gula sintaksis - kompiler mengubah yang pertama menjadi yang kedua, karena metode yang mendasarinya mengharapkan array untuk parameter vararg .
Lihat
sumber
jasonmp85 benar tentang meneruskan array yang berbeda
String.format
. Ukuran array tidak dapat diubah begitu dibangun, jadi Anda harus melewati array baru alih-alih memodifikasi yang sudah ada.sumber
Saya mengalami masalah yang sama.
Dan kemudian melewati obj sebagai argumen varargs. Itu berhasil.
sumber