generische Klasse für alle Maps (nicht Collections :-))

dermoritz

Bekanntes Mitglied
Ich versuche gerade eine Klasse zu bauen die für alle Collections funktioniert. Genaugenommen hat sie einen Constructor der eine Collection nimmt und eine Methode, welche etwas an diese Collection dranhängt (add) - (wer Google Web Toolkit kennt dem wird das bekannt vorkommen):
Java:
private class LoadMaps<E,T extends Collection> implements AsyncCallback<T> {
		private T target;
		
		protected LoadMaps( T whereTo) {
			target.add(whereTo);
		}

		@Override
		public void onFailure(Throwable caught) {
			Window.alert(caught.getMessage());

		}

		@Override
		public void onSuccess(T result) {
			target.addAll(result);
			fireEvent(success);
		}
	}

Nur leider funktioniert das nicht. Ein Aufruf des Cunstructors mit einer Map<String, List<String>> ergibt "The constructor AdminUnits.LoadMaps(TaskDoneEvent, Map<String,List<String>>) is undefined".
Was mach ich (schonwieder) falsch mit generics?
 
Zuletzt bearbeitet:

dermoritz

Bekanntes Mitglied
du glaubst nicht wie sehr mir die einfache Antwort hilft :). Gleichzeitig versinke ich vor Scham im Boden - manchmal ist man halt dümmer als man denkt (ich dachte ich bin zu dumm für generics, aber ich war sogar zu dumm für Collections/Maps)
 

dermoritz

Bekanntes Mitglied
noch eine klitzekleine frage: nun bekomme ich die "raw type" Warnungen. Wie bekomme ich die weg? Irgendwie reicht
Code:
private class LoadMaps<T extends Map<?,?>> implements AsyncCallback<T>...
nicht. Damit funktioniert
Code:
target.putAll(result)
nicht mehr:

Code:
The method putAll(Map<? extends capture#3-of ?,? extends capture#4-of ?>) in the type Map<capture#3-of ?,capture#4-of ?> is not applicable for the arguments (T)
 

Landei

Top Contributor
Map ist keine Collection.

Man könnte Map als eine Art Collection<Map.Entry> auffassen, die Frage ist, wie praktisch das ist, z.B. bezieht sich dann add, remove, contains u.s.w. immer auf dan gesamten Entry, also key und value zusammengenommen.

Ich habe mal einen Wrapper gebastelt (ungetestet):

Java:
import java.util.List;
import java.util.ArrayList;
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import static java.util.Map.Entry;

public class MapCollection<K,V> implements Collection<Entry<K,V>> {

    private final Map<K,V> map;
    
    public MapCollection(Map<K,V> map) {
        this.map = map;
    }
    
    public int size() {
        return map.size();
    }

    public boolean isEmpty() {
        return map.isEmpty();
    }

    public boolean contains(Object o) {
        if(o instanceof Entry) {
            Entry entry = (Entry) o;
            return entry.getValue().equals(map.get(entry.getKey()));
        }
        return false;
    }

    public Iterator<Entry<K, V>> iterator() {
        return map.entrySet().iterator();
    }

    public Object[] toArray() {
        Object[] array = new Object[size()];
        int i = 0;
        for(Iterator it = iterator(); it.hasNext();) {
            array[i++] = it.next();
        }
        return array;
    }

    public <T> T[] toArray(T[] a) {
        T[] array = (T[]) (a.length <= size() ? a 
                : Array.newInstance(a.getClass().getComponentType(), size()));
        int i = 0;
        for(Iterator it = iterator(); it.hasNext();) {
            array[i++] = (T) it.next();
        }
        return array;
    }

    public boolean add(Entry<K, V> e) {
        if(contains(e)) {
            return false;
        } else {
            map.put(e.getKey(), e.getValue());
            return true; 
        }
    }

    public boolean remove(Object o) {
        if(contains(o)) {
            Entry entry = (Entry) o;
            map.remove(entry.getKey());
            return true;
        } else {
            return false;
        }
        
    }

    public boolean containsAll(Collection<?> c) {
        for(Object o : c) {
            if(! contains(c)) {
                return false;
            }
        }
        return true;
    }

    public boolean addAll(Collection<? extends Entry<K, V>> c) {
        boolean changed = false;
        for(Entry<K,V> entry : c) {
            changed |= add(entry);
        }
        return changed;
    }

    public boolean removeAll(Collection<?> c) {
        boolean changed = false;
        for(Object entry : c) {
            changed |= remove(entry);
        }
        return changed;
    }

    public boolean retainAll(Collection<?> c) {
        List<Entry<K,V>> deleteList = new ArrayList<Entry<K,V>>();
        for(Entry<K,V> entry : this) {
            if (! c.contains(entry)) {
                deleteList.add(entry);
            }
        }
        return removeAll(deleteList);
    }

    public void clear() {
        map.clear();
    }

    public Map<K,V> getMap() {
        return map; 
    }
}
 

dermoritz

Bekanntes Mitglied
vielen dank werde mir das mal "bookmarken". Im Moment reicht mir aber tatsächlich die Klasse für alle Maps. Aber wie gesagt ich krieg die Raw-Type Warnungen nicht weg.

Was kann ich da machen?
 
S

SlaterB

Gast
was willst du denn machen, was bedeutet T? ist T die Map oder nicht eher der Valuetype in der Map?
wie genau ist der Key der Map eingegrenzt, wie sieht denn deine add()-Methode im Moment aus,
was genau fügst du als Key und Value ein?

Informationen preiszugeben würde helfen wenn du auf den Erhalt von Informationen hoffst,

edit: wie wärs mit
Java:
    public static <A, B, T extends Map<A, B>>void putAll(T one, T two)
    {
        one.putAll(two);
    }
 
Zuletzt bearbeitet von einem Moderator:
G

Gastredner

Gast
In generischen Collections, deren generischer Typ durch eine Wildcard ([c]?[/c]) gekennzeichnet ist, kannst du keine Objekte einfügen, wenn ich mich nicht irre. Der Compiler kann nicht sicherstellen, dass du ein Objekt vom korrekten Typ hinzufügst, und untersagt das Hinzufügen daher komplett.
 

dermoritz

Bekanntes Mitglied
ich will weder die keys noch die values der map einschränken. die klasse soll auf allen maps funktionieren - da ich lediglich "putAll".

nach dem Fauxpas mit maps sind keine collections sieht die Klasse nun so aus:
Java:
private class LoadMaps<T extends Map> implements AsyncCallback<T>{
		private T target;
		
		protected LoadMaps(TaskDoneEvent ev, T whereTo) {
			target = whereTo;
		}

		@Override
		public void onFailure(Throwable caught) {
			Window.alert(caught.getMessage());

		}

		@Override
		public void onSuccess(T result) {
			target.clear();
			target.putAll(result);
		}
	}
im Moment bekomme ich 2 raw-type Warnungen die ich gerne loswerden würd: in der ersten Zeile bei Map und in der Zeile mit "putAll". Ersteres bekomme ich weg in dem ich Map durch Map<?,?> ersetze, aber dann gibts nen Error bei putAll.

funktional sollte es klar sein was geschieht: man übergibt im contructor eine map die bei aufruf von onSuccess den inhalt von result enthält.

EDIT: um mal auf deinen Vorschlag einzugehen
Java:
private class LoadMaps<A,B,T extends Map<A,B>> implements AsyncCallback<T>
slaterB der bringt eben nur bedingt was: die Warnungen in der Klasse sind dann weg, aber sie bleiben bei jedem Aufruf des Constructors. Aus irgendeinem Grund kann ich nrgendwo "T<A,B>" verwenden.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
also bei mir funktionierts, wenn es auch nicht allzu schick aussieht, das gebe ich zu,
vielleicht habe ich aber manche Warnung ausgeschaltet,

wie immer: Informationen würden helfen, welcher Code, welche Fehlermeldung?

edit: ich habe noch eine zweite Variante eingebaut, wobei ich generische Parameter bei nicht-statischen Methoden eigentlich lieber vermeide

edit: und Variante 3
Java:
public class Test {
    public static void main(String[] args)  {
        Map<String, Integer> a = new HashMap<String, Integer>();

        LoadMaps<String, Integer, Map<String, Integer>> k = 
            new LoadMaps<String, Integer, Map<String, Integer>>();
        k.putAll(a, a);

        LoadMaps2<String, Integer> k2 = new LoadMaps2<String, Integer>();
        k2.putAll(a, a);
        
        LoadMaps3<String, Integer> k3 = new LoadMaps3<String, Integer>();
        k3.putAll(a, a);
    }
}

class LoadMaps<A, B, T extends Map<A, B>> {
    public void putAll(T one, T two){
        one.putAll(two);
    }
}

class LoadMaps2<A, B> {
    public <T extends Map<A, B>>void putAll(T one, T two) {
        one.putAll(two);
    }
}

class LoadMaps3<A, B> {
    public void putAll(Map<A, B> one, Map<A, B> two){
        one.putAll(two);
    }
}
 
Zuletzt bearbeitet von einem Moderator:

dermoritz

Bekanntes Mitglied
Danke!

der Fehler lag nur im Aufruf/ Instanziierung - und ja das sieht wirklich nicht schick aus. Aber besser gehts nicht oder - was meinen die anderen?

Es geht einfacher:
private class LoadMaps<K,V> implements AsyncCallback<Map<K,V>>...
!

da habe ich mich etwas im kreis gedreht - vielen Dank!
 
Zuletzt bearbeitet:
S

SlaterB

Gast
'siehe auch meine Edits' wollte ich mit der nächsten, also dieser, Antwort schreiben, die letzte Variante hast du ja jetzt auch ;)

unten noch ein Beispielprogramm, warum es nur mit Vorgabe der Gesamt-Map bzw. List in dem Beispiel nicht funktioniert,
man kann die Warnung zwar unterdrücken, aber bei falscher Bedienung sind dann Fehler möglich,

Problem ist ein halb allgemeiner Typ '? extends' für das T der Extra-Klasse Load,
wenn man dort das T einschränken könnte so dass nur List<Number> usw. statt List<? extendsNumber> gewählt werden könnte,
dann wäre die addAll()-Methode sicher,
mag sein dass es dafür eine Syntax gibt, ansonsten eine Begrenztheit in Java

Java:
public class Test {
    public static void main(String[] args)  {
        List<Integer> a = new ArrayList<Integer>();
        List<Double> b = new ArrayList<Double>();
        b.add(4.3);
        List<? extends Number> ca = a;
        List<? extends Number> cb = b;

        Load<List<? extends Number>> l = new Load<List<? extends Number>>();
        l.addAll(ca, cb);
        Integer k = a.get(0); // ClassCastException
    }
}

class Load<T extends List<?>> {
    public void addAll(T one, T two) {
        one.addAll((List)two);
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Problem beim schreiben einer eigene generische Klasse Hashtable Allgemeine Java-Themen 11
M Problem beim schreiben einer eigene generische Klasse LinkedList Allgemeine Java-Themen 34
H generische Klasse Realtion Allgemeine Java-Themen 2
G generische Klasse als Parameter einer generischen Klasse Allgemeine Java-Themen 5
Zrebna Random Number - Generische Formel zwischen zwei INKLUSIVEN Werten Allgemeine Java-Themen 16
F Verständnisprobleme Aufgabenstellung Aktionsobjekte und generische Listen Allgemeine Java-Themen 1
J Generische Interface - Problem Allgemeine Java-Themen 3
J Generische Interfaces mehrfach einbinden Allgemeine Java-Themen 11
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
T Interface mit generische Typen Allgemeine Java-Themen 5
A Methoden Generische Methode mit Arrays - Source Compatibility 1.7 benötigt, wieso? Allgemeine Java-Themen 3
M Interface Generische Klassen mit mehreren Typen überschreiben Allgemeine Java-Themen 0
H Interface Generische Schnittstelle (rekusiv) Allgemeine Java-Themen 2
C generische Authentifizierung Allgemeine Java-Themen 7
JCODA Generische Map Frage Allgemeine Java-Themen 10
H Generische Array Allgemeine Java-Themen 11
M Generische Methoden mit Java und globale Variablen Allgemeine Java-Themen 9
D Methode für generische enummap/enum Allgemeine Java-Themen 10
B Generische Datentypen MergeSort Allgemeine Java-Themen 5
M Generische Klassen Allgemeine Java-Themen 3
M generische Listener Allgemeine Java-Themen 2
S Generische Typen: Frage dazu Allgemeine Java-Themen 11
T Ideenfindung: Generische Transportklasse? Allgemeine Java-Themen 3
C Generische Methode (Schablone) Allgemeine Java-Themen 8
leifg Rechenoperationen auf generische Datentypen Allgemeine Java-Themen 10
B Generische Typen instanzieren Allgemeine Java-Themen 11
R Generische Listener und Sender Allgemeine Java-Themen 12
M Generische Datentypen Allgemeine Java-Themen 14
S Generische Liste Allgemeine Java-Themen 30
F Viele generische Parameter sinnvoll? oder besser casten? Allgemeine Java-Themen 10
S Generische Methode Allgemeine Java-Themen 13
R Frage zu einfügen in generische lineare Liste Allgemeine Java-Themen 7
S Generische Methoden Allgemeine Java-Themen 7
D Statische, generische Methode will nicht. Allgemeine Java-Themen 2
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
missy72 Klassen Eigene Klasse MessageWindow ähnlich der Alert Klasse Allgemeine Java-Themen 2
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
kanywayne Java programmieren: Polynom Klasse Allgemeine Java-Themen 4
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
C Klasse mit Mockito simulieren Allgemeine Java-Themen 9
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Thallius Key/Value Table in Klasse einlesen Allgemeine Java-Themen 14
S static in Interface und Klasse Allgemeine Java-Themen 2
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
D javassist API Klasse in MethodCall ermitteln Allgemeine Java-Themen 8
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
J Builder Klasse mit Lombok bauen Allgemeine Java-Themen 2
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
M [SOAP] - Klasse aus WSDL ausschließen Allgemeine Java-Themen 2
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
X Klassen Klasse BreakIterator Allgemeine Java-Themen 6
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
M Matcher-Klasse findet match nicht Allgemeine Java-Themen 6
cool_brivk24 Variablen abfragen von Boolean von anderer Klasse Allgemeine Java-Themen 12
S Seltsames Ergebnis mit Date-Klasse Allgemeine Java-Themen 6
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
M Kapselung Modellierung von Intervallen: Klasse Interval Allgemeine Java-Themen 4
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
J IndexOutOfBoundsException bei der Nutzung der Klasse Message von mime4j Allgemeine Java-Themen 5
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
perlenfischer1984 Lombok Builder soll andere Klasse bauen Allgemeine Java-Themen 4
perlenfischer1984 Mit Lombok Builder Felder in Super Klasse füllen Allgemeine Java-Themen 12
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2
K Mit Button neue Klasse öffnen Allgemeine Java-Themen 9
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
magdaStone Logikproblem Umschalten von booleans in anderer Klasse Allgemeine Java-Themen 7
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben