Generics - Map.putAll lässt sich nicht richtig implementiern

Status
Nicht offen für weitere Antworten.
G

Geralth

Gast
Hallo,

ich versuche gerade die Methode java.util.Map.putAll zu implementieren, meines Wissens nach sollte folgender Code eigentlich funktionieren (abgesehen vom fehlenden Rückgabewert), allerdings bemängelt der Compiler immer, dass der Rückgabetyp von entrySet nicht zu meiner Deklaration des Sets passt.

Hier der Code:
Java:
public void putAll( Map< ? extends K, ? extends V > entries ) {
        Set< Map.Entry< ?, ? > > set = entries.entrySet();
    }

Der Compiler meldet:
found : java.util.Set<java.util.Map.Entry<capture#695 of ? extends K,capture#713 of ? extends V>>
required: java.util.Set<java.util.Map.Entry<?,?>>
Set< Map.Entry< ?, ? > > set = entries.entrySet();

Habt ihr eine Idee was daran falsch ist?
 
S

SlaterB

Gast
http://mail-archives.apache.org/mod...0404s22291a5cma61e16824805791@mail.gmail.com>

> > It's a tricky one to be sure.
> >
> > The problem is that the entrySet() method is returning a
> > "Set<Map.Entry<capture-of ? extends K, capture-of ? extends V>>",
> > which is incompatible with the type "Set<Map.Entry<? extends K, ?
> > extends V>>". It's easier to describe why if I drop the "extends K"
> > and "extends V" part. So we have "Set<Map.Entry<?, ?>" and
> > "Set<Map.Entry<capture-of ?, capture-of ?>>".
> >
> > The first one, "Set<Map.Entry<?, ?>>" is a set of Map.Entries of
> > different types - ie it is a heterogeneous collection. It could
> > contain a Map.Entry<Long, Date> and a Map.Entry<String, ResultSet>>
> > and any other pair of types, all in the same set.
> >
> > On the other hand, "Set<Map.Entry<capture-of ?, capture-of ?>>" is a
> > homogenous collection of the same (albeit unknown) pair of types. Eg
> > it might be a Set<Map.Entry<Long, Date>>, so all of the entries in the
> > set MUST be Map.Entry<Long, Date>.
> >
> > In general, even if you could assign this to a local variable without
> > unchecked type safety warnings, you wouldn't be able to call any
> > methods on it because the compiler cannot check whether the access is
> > type-safe. For example you would not be able to call add() because the
> > Set must contain a specific type, but the compiler doesn't know which
> > specific type that is!
 
G

Geralth

Gast
Danke, dann ist klar warum es nicht geht und ich habe jetzt einfach so eine Schleife wie in dem Beitrag benutzt, da ich eh einmal drüberiterieren möchte.
 
S

Spacerat

Gast
Das Problem mit "generics" in irgendwelchen Maps scheint ja nach wie vor recht populär zu sein...

Nun habe ich eben genau dieses Problem auch gehabt. Hier ist mein Lösungsvorschlag:
Code:
private void putAll0(Map<String, String> m)
{
    Map.Entry<String, String> e;
    Iterator<Map.Entry<String, String>> i = m.entrySet().iterator();
    while(i.hasNext()) {
        e = i.next();
        if(e.getKey() != null && !e.getKey().equals("")) {
            if(containsKey(e.getKey())) getEntry(e.getKey()).setValue(e.getValue());
            else intern.add(e);
        }
    }
}

@SuppressWarnings("unchecked")
@Override
public void putAll(Map<? extends String, ? extends String> m)
{
    try {
        putAll0((Map<String, String>) m);
    } catch(Exception e) {
        // ignore
    }
}

private Map.Entry<String, String> getEntry(String key)
{
    Map.Entry<String, String> e;
    Iterator<Map.Entry<String, String>> i = intern.iterator();
    while(i.hasNext()) {
        e = i.next();
        if(e.getKey().equals(key)) return e;
    }
    return null;
}
Die Verwendung der Klasse String ist projektbezogen und kann in individuellen Implementierungen verändert werden.
Soll noch angemerkt werden, das "intern" eine ArrayList<Map.Entry<String, String>" ist und die Map vom Typ "Map<String, String>" leere Strings bzw. null als Schlüssel nicht zulässt. Als letztes frage ich mich, ob "? extends String" überhaupt Sinn macht... warum wohl... :)

mfg Spacerat
 
S

SlaterB

Gast
wenn die Klassen feststehen, wieso dann überhaupt eine generische Methode?
für den allgemeinen Fall dürfte das doch nicht helfen
 
S

Spacerat

Gast
SlaterB hat gesagt.:
wenn die Klassen feststehen, wieso dann überhaupt eine generische Methode?
für den allgemeinen Fall dürfte das doch nicht helfen
Ich bin ganz deiner Meinung, aber sag das mal dem Compiler (Eclipse). Normalerweise würde "putAll(Map<String, String> m)" völlig ausreichen. Das ergibt in Eclipse aber die Fehlermeldung "putAll(Map<String, String>) doesn't override putAll(Map<? captureOf String, ? captureOf String>)". Und das, wie schon angedeutet sogar bei "final" Klassen (im Beispiel: String). Und btw... für den allgemeinen Fall muss "String" nur durch die jeweils benötigten Klassen ersetzt werden, also auch durch K und V.

cu Spacerat
 
S

SlaterB

Gast
edit: ach schon gut, ich glaube ich sehe nun, wie du es meinst
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Generics machen mich verrückt Java Basics - Anfänger-Themen 8
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
MarvinsDepression Datentypen Generics: Erste Berührungen Java Basics - Anfänger-Themen 6
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
Cassy3 Generics - CompareTo Java Basics - Anfänger-Themen 21
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
districon Generics implementieren Java Basics - Anfänger-Themen 2
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Hilfe bei Generics Java Basics - Anfänger-Themen 11
G Generics Compilerfehler Java Basics - Anfänger-Themen 6
G Generics Methoden Java Basics - Anfänger-Themen 7
G Generics Java Basics - Anfänger-Themen 3
L Generics Tripel Java Basics - Anfänger-Themen 26
W Fragen zu Generics Java Basics - Anfänger-Themen 14
S Hilfe. Generics und BiFunctions Java Basics - Anfänger-Themen 10
X Wie Generics richtig benutzen ? Java Basics - Anfänger-Themen 5
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
I Java Generics factory method Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
I Generics und Comparable Java Basics - Anfänger-Themen 14
G Generics mit ? und Diamantoperator Java Basics - Anfänger-Themen 4
G Generics: Wildcard ? Java Basics - Anfänger-Themen 12
D Generics methode Java Basics - Anfänger-Themen 2
I Frage zu Generics und Wildcards Java Basics - Anfänger-Themen 2
N Generics und Casting eines Objekts Java Basics - Anfänger-Themen 1
A Generics Java Basics - Anfänger-Themen 6
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
W Generics - Typ zurückbekommen Java Basics - Anfänger-Themen 4
Dimax Erste Schritte Generics von Profis leicht erklärt Java Basics - Anfänger-Themen 7
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
J Collections Generics: Typ wird nicht erkannt Java Basics - Anfänger-Themen 7
D Generics ArrayList: Bug im Quellcode Java Basics - Anfänger-Themen 14
C Generics Java Basics - Anfänger-Themen 8
M Generics getter und setter Methoden Java Basics - Anfänger-Themen 4
T Generics in Java... Java Basics - Anfänger-Themen 9
J Generics Java Basics - Anfänger-Themen 3
J Generics Datentypen vergleichen Java Basics - Anfänger-Themen 16
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
O Generics - Implementierung Java Basics - Anfänger-Themen 7
Shizmo Frage zu Generics Java Basics - Anfänger-Themen 3
F Multiple Generics Java Basics - Anfänger-Themen 10
G Datentypen verschiedene Objekte in eine ArrayList, Generics Java Basics - Anfänger-Themen 2
H Typsicherheit/Generics Java Basics - Anfänger-Themen 1
U Java generics funktioniert nicht Java Basics - Anfänger-Themen 0
Tarrew Generics: Erste gemeinse Oberklasse als Rückgabewert Java Basics - Anfänger-Themen 1
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Generics Java Basics - Anfänger-Themen 4
M Frage zu Generics in Klassen, Abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
R Compiler-Fehler Generics Problem Java Basics - Anfänger-Themen 2
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7
K Generics bei Klassen- und Interfacedeklarationen Java Basics - Anfänger-Themen 3
D toArray und Generics Java Basics - Anfänger-Themen 2
D Zwei Generics beim Überladen von Methoden Java Basics - Anfänger-Themen 3
C Erste Schritte Filter für Generics oder ähnliches Java Basics - Anfänger-Themen 2
M Frage zu Generics-Deklaration Java Basics - Anfänger-Themen 5
S Frage zu Collection-Generics in Subklassen Java Basics - Anfänger-Themen 6
J Java Generics - Frage zu Types Java Basics - Anfänger-Themen 2
M <T> Generics Java Basics - Anfänger-Themen 7
B Interface Generics: prüfen ob Interface deklariert wird Java Basics - Anfänger-Themen 18
T Polymorphie Generics-Problem Java Basics - Anfänger-Themen 2
B Hilfe beim Verständnis zu Generics Java Basics - Anfänger-Themen 7
J Array Generics Java Basics - Anfänger-Themen 3
J Generics casten Java Basics - Anfänger-Themen 14
J Generics wildcard Java Basics - Anfänger-Themen 6
E Listen und Generics Java Basics - Anfänger-Themen 9
X Generics Java Basics - Anfänger-Themen 6
M Datei einlesen mit generics? Java Basics - Anfänger-Themen 9
D Warum sind Generics mit Vorsicht zu genießen? Java Basics - Anfänger-Themen 6
M OOP Mit Generics auf Methoden zugreifen? Java Basics - Anfänger-Themen 10
S Generics Java Basics - Anfänger-Themen 4
G Generics kein Zugriff auf getter eines Objekts Java Basics - Anfänger-Themen 4
L Datentypen Problem mit Generics und null Java Basics - Anfänger-Themen 6
E Klassen java.util.ArrayList<E> als Generics Java Basics - Anfänger-Themen 16
W Interface Problem mit Generics Java Basics - Anfänger-Themen 2
M OOP Generics und Wildcards Java Basics - Anfänger-Themen 3
D Generics - Warnmeldungen Java Basics - Anfänger-Themen 2
M Polymorphie generics einsteigerprobleme Java Basics - Anfänger-Themen 3
D Vererbung Generics und Vererbung Java Basics - Anfänger-Themen 8
C Generics Array Java Basics - Anfänger-Themen 43
D Fehler mit generics Java Basics - Anfänger-Themen 10
S Generics - CaseInsensitiveMap selber schreiben? Java Basics - Anfänger-Themen 5
K Datentypen Generics Java Basics - Anfänger-Themen 3
P Comparable und Generics Java Basics - Anfänger-Themen 6
I Generics (Subtypen) Java Basics - Anfänger-Themen 17
N Typeinschränkung bei Generics Java Basics - Anfänger-Themen 13
C Generics und Cast Java Basics - Anfänger-Themen 5
H Generics werden in -source 1.2 nicht unterstützt Java Basics - Anfänger-Themen 16
M Datentypen Generics: Exacten Typ ermitteln Java Basics - Anfänger-Themen 6
N Generics und Interfaces Java Basics - Anfänger-Themen 5
S Generics und "generische Feldzuweisungen" Java Basics - Anfänger-Themen 5
lumo Java Generics Java Basics - Anfänger-Themen 19
M verlinkte Liste mit generics Java Basics - Anfänger-Themen 7
capgeti Datentypen Static methoden aus Superklasse mit Generics definieren? Java Basics - Anfänger-Themen 9
S Generics und Typerkennung Java Basics - Anfänger-Themen 7
A Cast ohne Warnung bei Generics Java Basics - Anfänger-Themen 2
B Java Listen und Generics Java Basics - Anfänger-Themen 35
O Abstract Method & Generics Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben