Vererbung Objekt automatisch einem Set zuordnen...

Maikata

Mitglied
Hallo,
folgendes Problem: Ich habe sehr viele Sets (java.util.Set) mit Klassen die alle von einer Superklasse erben. Nun möchte ich eine addObject(Superklasse s); Methode schreiben, die erkennt um die Instanz welcher Klasse es sich handelt und dieses Objekt dann dem entsprechenden Set hinzufügt.

Klar kann ich das mit instanceof lösen, aber da ich ca. 40 Sets habe, würde das auf 40 if abfragen hinauslaufen.... Da muss es doch was einfacheres geben.
 
Pack deine Sets in eine Map<Class,Set> und lass dir über die Class von dem Object das richtige Set geben?
 
Das ist eine gute Idee, danke 🙂

Also würde es dann so Aussehen oder? :
Java:
sets.put(MeineKlasse.class, new Set<MeineKlasse>();

Ist das MeineKlasse.class richtig?


EDIT:
Achja, und wie mach ich das dann am besten?

Einfach so
Java:
private Map<Class, Set> sets = new TreeMap<Class, Set>();

Oder sollte ich parameter übergeben? Wenn ja welche? Wenn ich die Superklasse als parameter übergebe, geht put nicht....
 
Zuletzt bearbeitet:
Du müsstest vllt etwas mehr Code zeigen, damit man mehr kann als zu raten^^

Vllt hilft soetwas wie :

Code:
new Set<? extends MeineKlasse>
 
Würde mich über weitere Antworten freuen, da es so noch nicht ganz funktioniert :bahnhof:

Wie "funktioniert" das nicht?

Siehe hier ein Beispiel:
Java:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Test {

	public static void main(String[] args) {
		Set<A> as = new HashSet<A>();
		Set<B> bs = new HashSet<B>();
		Set<C> cs = new HashSet<C>();
		
		Map<Class,Set> sets = new HashMap<Class,Set>();
		sets.put(A.class, as);
		sets.put(B.class, bs);
		sets.put(C.class, cs);
		
		List<A> aList = new ArrayList<A>();
		aList.add(new A());
		aList.add(new B());
		aList.add(new C());
		aList.add(new A());
		aList.add(new B());
		aList.add(new C());
		
		for(A a : aList){
			sets.get(a.getClass()).add(a);
		}
		
		System.out.println("as =>"+Arrays.toString(as.toArray()));
		System.out.println("bs =>"+Arrays.toString(bs.toArray()));
		System.out.println("cs =>"+Arrays.toString(cs.toArray()));
	}

}

class A {
	
}

class B extends A{
	
}

class C extends A{
	
}

Achja - um den Rawtype zu vermeiden kannst du z.B. ein Interface nutzen:
Java:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Test {

	public static void main(String[] args) {
		Set<X> as = new HashSet<X>();
		Set<X> bs = new HashSet<X>();
		Set<X> cs = new HashSet<X>();
		
		Map<Class,Set<X>> sets = new HashMap<Class,Set<X>>();
		sets.put(A.class, as);
		sets.put(B.class, bs);
		sets.put(C.class, cs);
		
		List<A> aList = new ArrayList<A>();
		aList.add(new A());
		aList.add(new B());
		aList.add(new C());
		aList.add(new A());
		aList.add(new B());
		aList.add(new C());
		
		for(A a : aList){
			sets.get(a.getClass()).add(a);
		}
		
		System.out.println("as =>"+Arrays.toString(as.toArray()));
		System.out.println("bs =>"+Arrays.toString(bs.toArray()));
		System.out.println("cs =>"+Arrays.toString(cs.toArray()));
	}

}

interface X {
	
}

class A implements X {
	
}

class B extends A{
	
}

class C extends A{
	
}
 
Zuletzt bearbeitet von einem Moderator:
Danke für deine Antwort. Werde es heute abend anschauen, muss jetzt leider gehen.
Ich denke ich habe aber gefunden warum es nicht funktionierte: Meine Keys haben Comparable nicht implementiert. Werde es später noch einmal versuchen.
 
Danke für deine Antwort. Werde es heute abend anschauen, muss jetzt leider gehen.
Ich denke ich habe aber gefunden warum es nicht funktionierte: Meine Keys haben Comparable nicht implementiert. Werde es später noch einmal versuchen.

Das ist aber nur für die TreeMap interessant. Nimmst du ein HashMap brauchst du kein Conmparable. Ich sehe auch keinen Sinn in deinem Fall eine TreeMap zu nehmen.

In die Map kommt ja als Key eine Class. Da kannst du schlecht was dran ändern 😉
 

Zurück
Oben