Warnung für generische varargs

7

Ich habe die folgende Methode deklariert:

%Vor%

Es wird von Clients aufgerufen, die etwas wie

verwenden %Vor%

Die letzte Zeile oben erzeugt jedoch eine Warnung

  

Type safety: Ein generisches Array von Map wird für einen varargs-Parameter erstellt

Ich verstehe das nicht vollständig, aber ich denke, Varargs-Parameter werden in Arrays konvertiert, und es ist eine schlechte Idee, ein Array zu haben, dessen Typ eine generische Klasse ist (weil Generika invariant sind, Arrays dagegen nicht). .

Ich könnte dieses Problem lösen, indem ich die Methode als

neu einfüge %Vor%

Aber das bringt die Last mit sich, die Zeilenobjekte in eine Liste auf dem Client zu setzen, was ich lieber vermeiden würde. Gibt es eine bessere Lösung?

    
Dónal 23.11.2010, 15:45
quelle

4 Antworten

12

Um die Argumente an eine varargs-Methode zu übergeben, platziert der Compiler die Argumente in ein Array.

Die Warnung soll Sie wissen lassen, dass der Compiler nicht garantieren kann, dass jedes der Elemente im Array - jedes der Argumente für die Methode "varags" - wirklich ein Map<String, Object> ist.

Dies ist ein bisschen eine nervige Warnung, da es keine Möglichkeit gibt, das zu umgehen, außer die Methodensignatur neu zu definieren, um Varargs nicht zu verwenden. IMO ist es sicher zu ignorieren, solange Sie ziemlich sicher sind, die tatsächlichen Laufzeittypen dieser Argumente (die in diesem Fall Sie sind).

    
matt b 23.11.2010, 15:59
quelle
4

Es gibt keine Möglichkeit, diese Warnung zu vermeiden, außer dass @SuppresWarning("unchecked") zur Methode hinzugefügt wird :)

Da Sie sagen, dass es sich um eine private Methode handelt, gibt es in diesem Fall keine "Clients" und Sie haben die Kontrolle über die Methode. Daher erscheint es sinnlos, die Warnung zu ignorieren.

Einige Male, als ich Methoden erstellt habe, die parametrisierte Typen als Varargs-Parameter verwenden, habe ich einige Überladungen erstellt:

%Vor%

Das könnte einige der Warnungen vermeiden, abhängig davon, wie viele Argumente geliefert werden.

    
Uhlen 23.11.2010 16:00
quelle
2

Sie können die Last der Verwendung einer Liste anstatt von varargs verringern, indem Sie eine Builder-Schnittstelle verwenden (z. B. wie die, die ich benutze ). Mit diesem CollectionBuilder würde es etwa so aussehen:

%Vor%

es ist jedoch ohne generische args hübscher:

%Vor%

Es ist sicherlich länger als die varargs Lösung, aber manchmal ziemlich praktisch.

    
sfussenegger 23.11.2010 17:00
quelle
2

Für alle, die hier landen, sind die Antworten etwas alt. Java 7 hat die Annotation @Safevarargs eingeführt, um das Problem zu beheben:

%Vor%

Aus dem Javadoc:

  

Eine Programmiererbehauptung, dass der Körper der annotierten Methode oder   Konstruktor führt keine potenziell unsicheren Operationen auf seinem   Varargs Parameter. Anwenden dieser Anmerkung auf eine Methode oder   Konstruktor unterdrückt unkontrollierte Warnungen über a    nicht-verifizierbar Variable Arity (Vararg) Typ und unterdrückt   Ungeprüfte Warnungen zur parametrisierten Array-Erstellung beim Aufruf   Websites.

    
Brendan Humphreys 02.08.2017 05:09
quelle