Heute hatte ich ein kleines Java Problem. Stellt euch mal vor ihr habt 3 Klassen. Eine abstrakte Klasse Planet, die nur eine Methode besitzt.
Dann gibt es 2 konkrete Klassen Mars und Venus. Die konkreten Klassen sollen mittels der Methode getImplClazz() die Klasse angeben welche zur Implementierung genutzt werden soll. Im Beispiel verweisen die Klassen immer auf sich selbst, es könnten hier aber im Prinzip beliebige Klassen zurückgegeben werden.
Java
- public abstract class Planet {
- protected abstract Class getImplClazz();
- }
- public class Venus extends Planet {
- public Class getImplClazz() {
- return Venus.class;
- }
- }
- public class Mars extends Planet {
- @Override
- protected Class getImplClazz() {
- return Mars.class;
- }
- }
Nun werden die Klassen instanziiert und ihr möchtet testen ob ein Objekt vom Typ Venus oder Mars ist.
Man sollte meinen, dies geht mittels instanceOf(). Es kommt aber zu einem Compilerfehler bei der Prüfung.
Java
- public static void main(String[] args) {
- Planet mars = new Mars();
- Planet venus = new Venus();
- if(mars instanceof venus.getImplClazz()) { //Compilerfehler
- }
- }
Warum ist das so?
Der Trick ist, dass hier nicht instanceOf() verwendet werden darf, da instanceOf() nur mit referenzierten Typen arbeitet, nicht jedoch mit Objekten.
Wie lässt sich das Problem beheben?
Ganz einfach, es muss die Methode isInstance() auf die Klasse angewendet werden.
Java
- public static void main(String[] args) {
- Planet mars = new Mars();
- Planet venus = new Venus();
- if(venus.getImplClazz().isInstance(mars)) { //OK
- }
- }
Ich hoffe dieses kleine Lösung hilft dem ein oder anderen, die vielleicht mal auf dieses Problem stoßen.