2014-01-10 5 views
19

Ich habe folgendes JAVA Verfahren aufgrund einer Schnittstelle implementiert:Methode im Typ Map <String, Capture # 1-of? Objekt erstreckt> ist nicht anwendbar

public String importDocument(ImportSource source, Map<String, ? extends Object> paramMap); 

Wenn ich versuche, folgendes zu tun, erhalte ich eine Kompilierung Warnung. Snippet:

paramMap.put("Key", "Value"); 

Fehler:

The method put(String, capture#1-of ? extends Object) in the type Map is not applicable for the arguments (String, String)

Warum?

Antwort

19
? extends Object 

Sie verwenden generische Platzhalter. Sie können keine Add-Operation ausführen, da der Klassentyp nicht festgelegt ist. Sie können nichts hinzufügen/hinzufügen (außer null).

Weitere Informationen zur Verwendung von Platzhaltern finden Sie unter oracle docs.

Da wir nicht wissen, wofür der Elementtyp von c steht, können wir keine Objekte hinzufügen. Die add() Methode verwendet Argumente von type E, dem Elementtyp der Auflistung. Wenn der tatsächliche Typparameter ? ist, steht er für einige unknown type. Jeder Parameter, den wir zum Hinzufügen übergeben, muss ein Untertyp dieses unbekannten Typs sein. Da wir nicht wissen, um welchen Typ es sich handelt, können wir nichts übergeben. The sole exception is null, which is a member of every type.

+0

bedeutet dies, dass, wenn ich einen Wert zu den params hinzufügen müssen, ich eine neue Karte erstellen müssen mit allen Werten und benutze das stattdessen? – Emaborsa

+0

Wenn Sie Parameter hinzufügen möchten, verwenden Sie keine Platzhalter, verwenden Sie stattdessen 'Map '. –

+0

Wie auch immer '? extends Object' ergibt keinen Sinn, da jede Klasse als Argument in Frage kommt. –

0

Sie können versuchen, das Element, das Sie hinzufügen, dem generischen Typ hinzuzufügen, bevor Sie es hinzufügen.

Für diesen Prototyp:

public <T extends RandomClass> void randomMethod(Collection<T> randomCollection); 

ich so werfen vor der Zugabe:

randomCollection.add((T) addedItem); 
+0

Es könnte sich lohnen, Ihre Antwort mit einem Beispiel zu erweitern, was Sie meinen ... Wie sollte der Code aussehen? – Phil

Verwandte Themen