Generics (Subtypen)

iamapo

Mitglied
Hallo,

ich habe ein Problem mit folgender Aufgabenstellung:

Schreiben Sie eine statische generische Methode copyTo, die die Inhalte der Map mtv in die Map mtu kopiert. Das erste Argument von copyTo ist mtv, das zweite mtu. Wenn der Schlüssel aus mtv bereits in mtu enthalten ist, dann darf nicht kopiert werden. Für die Schlüssel und Werte in mtv sollen auch Subtypen der Schlüssel und Werte in mtu möglich sein.


Den Kopiermechanismus habe ich schon implementiert:
Java:
public static <k, v> Map copyTo(Map mtv , Map mtu){
    	Map result =new HashMap(mtu);
    	Iterator iter = mtv.entrySet().iterator();
    	while (iter.hasNext()){
    		Map.Entry pairs = (Entry) iter.next();
    		if(!result.containsKey(pairs.getKey())){
    			result.put(pairs.getKey(), pairs.getValue());
    		}
    	}
    	return result;
    }


Das was ich jetzt nicht verstehe ist, wie ich die Subtypen der Schlüssel und Werte einbaue.
Kann mir da jemand helfen, bzw hat einen kleinen Tipp für mich?

Grüße
 

Marco13

Top Contributor
Die ganzen Map, Iterator usw. sind ja raw types. Füg' da erstmal die passenden Generic-Typparameter (Map<X,Y> ...) hinzu. (Und die NUR als einzelne GROSSbuchstaben!!!). Dann kann man mal weitersehen.
 

iamapo

Mitglied
Ist das so richtig?

Java:
public static <K,V> Map<K, V> copyTo(Map mtv , Map mtu){
    	Map<K,V>result =new HashMap<K, V>(mtu);
    	Iterator<?> iter = mtv.entrySet().iterator();
    	while (iter.hasNext()){
    		Map.Entry<K,V> pairs =(Entry<K, V>) iter.next();
    			if(!result.containsKey(pairs.getKey())){
    			result.put(pairs.getKey(), pairs.getValue());
    		}
    	}
    	return result;
    }

Grüße
 

Antoras

Top Contributor
Anstatt dem Iterator und der while-Schleife kannst du auch die foreach-Schleife nehmen. Und den Iterator darfst du genauso wie die Parameter der Methode ebenfalls mit dem korrekten Typ parametisieren.

Java:
<K, V> Map<K, V> copyTo(final Map<K, V> mtv, final Map<K, V> mtu) {
	final Map<K, V> result = new HashMap<K, V>(mtu);
	final Iterator<Map.Entry<K, V>> iter = mtv.entrySet().iterator();
	while (iter.hasNext()) {
		final Map.Entry<K, V> pairs = iter.next();
		if (!result.containsKey(pairs.getKey())) {
			result.put(pairs.getKey(), pairs.getValue());
		}
	}
	return result;
}

Java:
<K, V> Map<K, V> copyTo(final Map<K, V> mtv, final Map<K, V> mtu) {
	final Map<K, V> result = new HashMap<K, V>(mtu);
	for (final Map.Entry<K, V> pair : mtv.entrySet()) {
		if (!result.containsKey(pair.getKey())) {
			result.put(pair.getKey(), pair.getValue());
		}
	}
	return result;
}
 

NattleBet

Mitglied
Ich sehe da immernur ein <K, V>... bisher kannt ich das nur mit konkreten generischen Typen für die Map.
z.B. Map<String, MyClass>
Wo ist jetzt der Clue bei dem <K, V> ? Was bedeutet das?
 

Marco13

Top Contributor
Der Trick ist, dass damit erst beim Aufruf entschieden wird, welcher Typ das ist
Java:
Map<Integer, String> s;
Map<Integer, String> t;
copyTo(s,t); // geht

Map<String, Float> s;
Map<String, Float> t;
copyTo(s,t); // geht auch

Und was jetzt noch gehen soll ist sowas wie
Java:
Map<Integer, String> s;
Map<Number, String> t;
copyTo(s,t); // soll gehen
 

NattleBet

Mitglied
Weiss zwar nicht wie die generischen Typen beim Kopieren passen sollen, aber man könnte ja die <K, V> Definition erweitern:

Java:
public static <K, V, A, B> Map<A, B> copyTo(Map<K, V> mtv, Map<A, B> mtu) {
		Map<A, B> result = new HashMap<A, B>(mtu);
		Iterator<Map.Entry<K, V>> iter = mtv.entrySet().iterator();
		while (iter.hasNext()) {
			Entry<K, V> pairs = iter.next();
			if (!result.containsKey(pairs.getKey())) {
				result.put((A)pairs.getKey(), (B)pairs.getValue());
			}
		}
		return result;
	}
 
Zuletzt bearbeitet:

iamapo

Mitglied
Danke für die vielen Antworten.
Aber wie bekomm ich jetzt mein Problem mit den Subtypen hin?
Bzw was ist genau ein Subtyp?

Grüße und vielen Dank für die Antworten.
 

Marco13

Top Contributor
@NattleBet: So eben gerade nicht ;)

@iamapo: Ein Beispiel hatte ich schon beschrieben
Java:
Map<Integer, String> s;
Map<Number, String> t;
copyTo(s,t); // soll gehen

Man kann ja auch sowas machen wie
Java:
Map<Number, String> map = ...
Integer i = Integer.valueOf(123);
map.put(i, "Hallo");
Und das ganze jetzt eben für die copy-Methode erweitert.

Schau mal bei Angie vorbei ;)
 

NattleBet

Mitglied
Also ein Subtyp ist eine Abgeleitete Klasse von der Superklasse.
Meine Idee ist jetzt die Typen der Maps von einander abhängig zu machen mit extends.

Java:
	public static <K, V> Map<K, V> copyTo(Map<? extends K, ? extends V> mtv, Map<K, V> mtu) {
		Map<K, V> result = new HashMap<K, V>(mtu);
		Iterator<?> iter = mtv.entrySet().iterator();
		while (iter.hasNext()) {
			Map.Entry<? extends K, ? extends V> pairs = iter.next();
			if (!result.containsKey(pairs.getKey())) {
				result.put(pairs.getKey(), pairs.getValue());
			}
		}
		return result;
	}

Bin jetzt soweit, aber irgendwie mag mich der iter.next() noch nicht... ;(
Ist das der richtige Ansatz? ???:L Hab ja bisher noch kein cast benutzt :applaus:
 

Marco13

Top Contributor
Ist doch gar nicht dein Thread?! ???:L
Wie auch immer - man kann auch sowas schreiben wie
public static <K, V, L extends K> Map<K, V> ...
um den Typ zu kennen. Abgesehen davon stand nirgendwo, dass dort eine Map zurückgegeben werden soll, sondern dass von der einen in die andere kopiert werden soll.
 

NattleBet

Mitglied
Ja das ist nicht mein Thread, deswegen interessiert mich trotzdem die Lösung.
Der Rückgabewert von der Methode ist mir auch egal, dass hat der Ersteller so vorgegeben und spielt für mich keine Rolle. Will nur wissen, wie das mit den generics geht!

Was eben noch falsch ist ist die eine Zeile:

Java:
Map.Entry<? extends K, ? extends V> pairs = iter.next();
 

NattleBet

Mitglied
Habs jetzt gelöst... hoff ich

Java:
public class Test2 {
	public static void main(String[] args) {
		Map<Integer, String> s1 = new HashMap<Integer, String>();
		s1.put(1, "EINS");
		s1.put(2, "EINS");
		Map<Integer, String> t1 = new HashMap<Integer, String>();
		t1 = copyTo(s1, t1); // geht

		Map<String, Float> s2 = new HashMap<String, Float>();
		s2.put("00100", (float) 0.1);
		Map<String, Float> t2 = new HashMap<String, Float>();
		t2 = copyTo(s2, t2); // geht auch

		Map<Integer, String> s3 = new HashMap<Integer, String>();
		s3.put(1, "EINS");
		s3.put(2, "ZWEI");
		Map<Number, String> t3 = new HashMap<Number, String>();
		t3 = copyTo(s3, t3); // soll gehen
	}

	public static <K, V, K2 extends K, V2 extends V> Map<K, V> copyTo(Map<K2, V2> mtv, Map<K, V> mtu) {
		Map<K, V> result = new HashMap<K, V>(mtu);
		Iterator<Entry<K2, V2>> iter = mtv.entrySet().iterator();
		while (iter.hasNext()) {
			Map.Entry<K2, V2> pairs = iter.next();
			if (!result.containsKey(pairs.getKey())) {
				result.put(pairs.getKey(), pairs.getValue());
			}
		}
		return result;
	}
}
 

Antoras

Top Contributor
Das sollte auch gehen:
Java:
    public static <K, V> Map<K, V> copyTo(Map<? extends K, ? extends V> mtv, Map<K, V> mtu) {
        Map<K, V> result = new HashMap<K, V>(mtu);
        Iterator<? extends Map.Entry<? extends K, ? extends V>> iter = mtv.entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry<? extends K, ? extends V> pairs = iter.next();
            if (!result.containsKey(pairs.getKey())) {
                result.put(pairs.getKey(), pairs.getValue());
            }
        }
        return result;
    }
 

Marco13

Top Contributor
Ja, ich finde aber, ab einer gewissen Verschachtelungstiefe haben die <? extends X<? extends Y, ? extends Z>> Generics die Tendenz abgefuckt unübersichtlich zu werden ;)

Jetzt noch mit foreach, dann hat der TO endlich die Lösung
Java:
    public static <K, V, L extends K> Map<K, V> copyTo(Map<L, V> mtv, Map<K, V> mtu) 
    {
        Map<K, V> result = new HashMap<K, V>(mtu);
        for (Map.Entry<L, V> entry : mtv.entrySet())
        {
            if (!result.containsKey(entry.getKey())) 
            {
                result.put(entry.getKey(), entry.getValue());
            }
        }
        return result;
    }
 
Ä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
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
K Aufgabe Generics Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben