2015-08-28 10 views
5

To jest mój przykładowy kod, w którym otrzymuję ostrzeżenie.Wyjaśnij ostrzeżenie: nie wywołanie metody varargs z niedokładnym typem argumentu dla ostatniego parametru

String lsSQL = foMetaQuery.getSQL(); 
String lsNewSQL = replace(lsSQL,"'' {","''{"); 
lsNewSQL = replace(lsNewSQL," } ''","}''"); 
lsNewSQL = replace(lsNewSQL," }","}"); 
lsNewSQL = MessageFormat.format(lsNewSQL,foSubstitutionArray); 
loVSQueryDef.setSQL(lsNewSQL); 

Kompilator mówi

oddanych do java.lang.Object na gipsie połączeń varargs do java.lang.Object [] do rozmowy non-varargs i stłumienia tego ostrzeżenia

lsNewSQL = MessageFormat.format(lsNewSQL,foSubstitutionArray); 
+0

Co zawiera element "foSubstitutionArray"? Jaki jest jego typ? – RealSkeptic

+0

foSubstitutionArray - The String Array z wartościami podstawień. Powinna być taka sama liczba elementów tablicowych *, ile liczba posiadaczy miejsc. –

Odpowiedz

8

nie pokazują, jaki typ foSubstitutionArray ma, ale będę zakładać, że jest to matryca typu innego niż Object.

Teraz, MessageFormat.Format() jest metodą varargs, co oznacza, że ​​można przekazać jej dowolną liczbę argumentów (no, co najmniej 1), a Java wewnętrznie zbierze je wszystkie w tablicy obiektów. Jednak tutaj przekazujesz tablicę, więc Java się myli: czy próbujesz przekazać pojedynczy argument (to akurat jest tablicą), czy też przekazujesz zmienne argumenty?

Jeśli zamierzają przekazać jeden argument (mało prawdopodobne), dodaj obsadę do obiektu:

MessageFormat.format(lsNewSql, (Object) foSubstitutionArray) 

Jeśli zamierzają wartości, które należy podjąć z tablicy, oddanych do Object []:

MessageFormat.format(lsNewSql, (Object[]) foSubstitutionArray) 
+0

foSubstitutionArray - The String Array z wartościami podstawień.Powinna być taka sama liczba elementów tablicowych *, ile liczba posiadaczy miejsc. –

+0

Wielkie dzięki Zastai :) –

1

MessageFormat.format() ma zmiennej arity podpis, który jest wygoda dla programisty, który pozwala pisać

  • format("Hello")
  • format("Hello {name}", name)
  • format("Hello {first} {last}", first, last)

Na poziomie kodu bajtowego, podpis metoda ma dwa parametry typu String i Object[], ale za kulisami kompilator tworzy tablicę dla ciebie, więc don” t należy wpisać: new Object[] {first, last}. Nadal możesz utworzyć tablicę wyraźnie za pomocą format("Hello", new Object[]{}), a kompilator będzie zadowolony.

Jednak kiedy przekazać tablicę ciągów jako ostatni parametr, istnieją dwie możliwe interpretacje:

  • format("Hello", new String[] {first, last})
  • format("Hello", new Object[]{new String[] {first, last}})

Dla zachowania kompatybilności wstecznej, kompilator zakłada poprzedniego i wyświetla ostrzeżenie zamiast błędu, ale wciąż prosi o wstawienie rzutowania do Object lub Object[], aby podać w kodzie źródłowym, co naprawdę masz na myśli.

Powiązane problemy