Chciałbym móc stworzyć funkcję, taką jak:
class A {
private String extraVar;
public String myFormat(String format, Object ... args){
return String.format(format, extraVar, args);
}
}
Problem polega na tym, że args
jest traktowany jak Object[]
w metodzie myFormat
, a tym samym jest jednym argumentem String.format
, natomiast chciałbym każdy Object
w args
które mają być przekazane jako nowy argument. Ponieważ String.format
jest to również metoda ze zmiennymi argumentami, powinno to być możliwe.
Jeśli nie jest to możliwe, czy istnieje metoda taka jak String.format(String format, Object[] args)
? W tym przypadku można ja dołączana extraVar
do args
stosując nową tablicę i przekazać go do tego sposobu.
java
arrays
backwards-compatibility
variadic-functions
użytkownik362382
źródło
źródło
Odpowiedzi:
Podstawowym typem metody variadic
function(Object... args)
jestfunction(Object[] args)
. W ten sposób firma Sun dodała varargs, aby zachować kompatybilność wsteczną.Więc powinieneś być w stanie po prostu przygotować
extraVar
sięargs
i zadzwonićString.format(format, args)
.źródło
X[]
do metodyx(X... xs)
daje następujące ostrzeżenie w środowisku 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.
Tak, a
T...
jest tylko cukrem syntaktycznym dlaT[]
.JLS 8.4.1 Parametry formatu
Oto przykład ilustrujący:
I tak, powyższa
main
metoda jest poprawna, ponieważ znowuString...
jest słusznaString[]
. Ponadto, ponieważ tablice są kowariantne, aString[]
jest anObject[]
, więc możesz także zadzwonić wezFormat(args)
obie strony.Zobacz też
Varargs gotchas # 1: pasujący
null
Sposób rozwiązywania vararg jest dość skomplikowany i czasami robi rzeczy, które mogą cię zaskoczyć.
Rozważ ten przykład:
Ze względu na to, jak varargs są rozwiązane, ostatnie wywołuje Oświadczenie
objs = null
, które oczywiście mogłyby spowodowaćNullPointerException
zobjs.length
. Jeśli chcesz podać jedennull
argument parametrowi varargs, możesz wykonać jedną z następujących czynności:Powiązane pytania
Poniżej znajduje się próbka niektórych pytań zadawanych przez ludzi podczas obsługi varargs:
Vararg gotchas # 2: dodając dodatkowe argumenty
Jak się dowiedziałeś, następujące „nie działa”:
Ze względu na sposób działania varargs,
ezFormat
faktycznie dostaje 2 argumenty, pierwszy to aString[]
, a drugi toString
. Jeśli przekazujesz tablicę do varargs i chcesz, aby jej elementy były rozpoznawane jako pojedyncze argumenty, a także musisz dodać dodatkowy argument, nie masz innego wyjścia, jak stworzyć inną tablicę, która pomieści dodatkowy element.Oto kilka przydatnych metod pomocniczych:
Teraz możesz wykonać następujące czynności:
Varargs gotchas # 3: przekazując szereg prymitywów
To nie „działa”:
Varargs działa tylko z typami referencyjnymi. Autoboxing nie dotyczy tablicy prymitywów. Następujące prace:
źródło
X[]
do metodyx(X... xs)
daje następujące ostrzeżenie w środowisku 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.
Przekazanie tablicy jest w porządku - w rzeczywistości oznacza to to samo
jest taki sam jak
To tylko cukier syntaktyczny - kompilator konwertuje pierwszy na drugi, ponieważ podstawowa metoda oczekuje tablicy parametru vararg .
Widzieć
źródło
jasonmp85 ma rację, mówiąc o przekazaniu innej tablicy
String.format
. Rozmiar tablicy nie może zostać zmieniony po zbudowaniu, więc trzeba będzie przekazać nową tablicę zamiast modyfikować istniejącą.źródło
Miałem ten sam problem.
A potem przekazał obj jako argument varargs. Zadziałało.
źródło