Generics und Cast

chrisch_hh

Neues Mitglied
Hallo,

ich bin noch sehr neu in Java und habe eine Frage. Folgende Ausgangssituation: Ich habe mehrere Listen definiert, die einander sehr ähnliche Objekte beinhalten, also z.B.:

Java:
private static List<Person> persons = new ArrayList<Person>();
private static List<Organization> organizations = new ArrayList<Organization>();
...

Jetzt sollen neue Elemente in diese Listen eingefügt werden und vorher sollen bestimmte Prüfungen durchgeführt werden, ob die Bezeichnung für eine Person valide ist usw. Damit ich nun nicht für jeden Typ eine eigene Methode schreiben muss, habe ich eine generische Methode geschrieben, die etwa so aussieht:

Java:
private static <T> void addObject(List<T> list, String name, int type) {

		Object o = null;

		switch (type) {

		case PERSON:
			
			o = new Person(name);

			break;

		case ORGANIZATION:
			
			o = new Organization(name);

			break;

		}

		// fuege neues Element hinzu
		list.add((T) o);
}

Ich übergebe also die Liste, einen Namen und eine Konstante, anhand derer der Methode der Typ des Objektes mitgeteillt wird, welches in die Liste eingefügt werden soll.

Bei list.add((T) o); meckert der Compiler über einen unsicheren Cast from Object to T. Mit @SuppressWarnings("unchecked") kann ich das natürlich unterdrücken, aber wirklich sauber ist es ja nicht. Wie kann ich prüfen, ob der Typ des Objektes o auch wirklich gleich dem Typ der Objekte in der übergebenen Liste list ist?

Ich habe da schon ordentlich bei Google gesucht, aber noch keine wirkliche Lösung gefunden... ???:L
 
dafür ist Generics nicht gedacht, es hilft dir dabei nicht, du könntest allgemeine Tests wie
Java:
if (o instanceof Person) {

} else {
durchführen

------

den 'unsicheren Cast' kannst du auch nicht aufheben,

es sei denn du stellst alles mit viel Arbeit um, z.B. könntest du neben List<T> noch eine Factory<T> übergeben,
Generics passt beim Methodenaufruf auf, dass beide zusammenpassen,
die Factory (deine Klasse, ein Objekt zu Typ konfigurieren) erstellt ein T-Objekt

edit: aber deine Methode soll ja quasi die Factory sein, die Objekte erstellt, nur eine Methode für alle Klassen,
das geht eben in der Art nicht
 
Wenn du der Methode den Typ als Objekt mitgibst (T ist kein Typ sondern nur ein Platzhalter), kannst du die unchecked warning umgehen. Aber ob dir diese Lösung besser gefällt, musst du selbst wissen 😉
Java:
private static <T> void addObject(List<T> list, String name, Class<T> clazz) throws IllegalArgumentException,
        SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException,
        NoSuchMethodException {
    list.add(clazz.getDeclaredConstructor(String.class).newInstance(name));
}
 
oh, dann muss ich zu meinen Beitrag nachtragen dass das instanceof nur mit einem vorhandenen T-Objekt funktioniert,
o nicht, denn o ist null, entweder ein Objekt aus der hoffentlich nicht leeren Liste, oder wie in kirax Antwort zusätzlicher Parameter
 
Vor lauter lauter hab ich jetzt vergessen zu erklären wie bei meiner Idee der Aufruf aussehen würde 😉

Java:
addObject(personenListe, "irgendein sinnvoller Name für eine Person", Person.class);
addObject(orgaListe, "irgendein sinnvoller Name für eine Organisation", Organisation.class);
😉
 

Zurück
Oben