Objekttyp eines übergebenen Objektes unter Bedingung (istanceof) zurückgeben

RalU

Mitglied
Hallo Forum,

ich habe folgendes Problem.
Ich habe eine Klasse, in der in einer ArrayList "fnmlisteners" Objekte von verschiedenen anderen Klassen vorliegen, die alle das Interface "NetworkModelListener" implementieren.

Jetzt benötige ich eine Hilfsmethode, die folgendes erfüllt:
Als Parameter übergebe ich der Methode eine Variable vom Typ Object, der allerdings nicht wirklich vom Typ Object ist, sondern irgend einem anderen Typ.
Die Methode soll nun prüfen, ob der so übergebene Parameter einem solchem Objekttyp entspricht, der in der ArrayList auftaucht. Ist dies der Fall, soll die Methode das entsprechende Objekt aus der ArrayList zurückliefern.
Liegt ein solcher Objekttyp, der als Parameter übergeben wurde jedoch nicht als Objekttyp in der ArrayList vor, so soll null zurückgeliefert werden.

Beispiel: Ich übergebe der Methode ein Objekt vom Typ "Testklasse".
Liegt in der ArrayList ein Objekt des Typs "Testklasse" vor, wird genau dieses Objekt aus der ArrayList zurückgeliefert, ansonsten wird null zurückgeliefert.
Wichtig ist aber, dass ich der Hilfsmethode nicht nur Objekte vom Typ "Testklasse" übergeben kann, sondern im Prinzip alle möglichen Ojekte.

Ich habe versucht, es mit instanceof zu lösen, jedoch ohne Erfolg:
Code:
public Object getDeclaredViewClass(Object viewclass)
{
for(FlowNetworkModelListener li : fnmlisteners)
{
 if(li instanceof Object)
{
     return li;
}
}
return null;
}
Das Problem liegt im instanceof-Vergleich.

Jetzt hab ich mal versucht, das Ganze mit Generics zu lösen, aber leider auch ohne Erfolg:
Code:
public <T> getDeclaredViewClass(T viewclass)
{
   for(FlowNetworkModelListener li : fnmlisteners)
   {
      if(li instanceof T)
     {
     T t = (T)li;
    return t;
     }
   }
  return null;
}
Auch hier liefert instanceof einen Fehler, weil er mit dem Typparameter T nicht zurecht kommt.

Gibt es für mein Problem einen anderen Lösungsweg?
 
Hallo,

versuch es mal so
Code:
public Object getDeclaredViewClass(Class<?> viewclass) {
		for (FlowNetworkModelListener li : fnmlisteners) {
			if (viewclass.isAssignableFrom(li.getClass())) {
				return li;
			}
		}
		return null;
	}

Gruß

Sascha
 
Hi,

Schreib mal warum du das tun möchtest was du tun willst.
Möglicherweise bist du grad dabei ein Rad neu zu erfinden, was zum Beispiel mit dem Factory Pattern leichter zu lösen ist.

Für die Lösung deines Problems soweit wie ich es richtig verstanden habe, würde ich folgendes empfehlen.
Änder das Array fnmlisteners in eine Map um, und verwende die ClassObjekte der enthaltenen Objekte als Keys.
So solltest du dann ganz einfach mit folgendem das entsprechende Objekt aus der Map enthalten.

Code:
public Object getDeclaredViewClass(Object viewclass) {
		return fnmlisteners.get(object.getClass());
}
 
Zurück