Problem mit instanceof



  • Hallo icarus2,

    jaa, das ist genau das, was ich brauche. Super! Jetzt funktioniert es. Herzlichen Dank!

    Noch zwei Anmerkungen:

    1.)

    icarus2 schrieb:

    temp = (A) o;
    

    Ist dieser expliziere Cast hier notwendig oder einfach nur schön? "temp" ist immerhin schon vom Typ A?

    2.)

    icarus schrieb:

    Das equals bei

    this.title.equals(temp.title)
    

    hat nichts mit dem equals der Klasse B zu tun. Es ist das equals, das in der Klasse String definiert ist.

    [/quote]

    Gut, dass Du es ansprichst. Es war mir zwar klar, aber doppelt hält besser. Der Unterschied zwischen "equals" und "==" ist wohl der vergleichbar mit "gleich" und "identisch" 😃

    Danke dir noch einmal!

    lg, freakC++



  • bzw. warum muss dieser Cast sein? Ich sehe ja bei mir, dass es sonst einen Fehler gibt 🙂

    edit: Irgendwie ist es mir klar, weil o ja vom Typ "object" ist. Aber durch die if-Abfrage weiß ich doch, dass es eine Instanz von Product ist....



  • Es braucht dort einen expliziten Cast, weil es ein Downcasting ist. Da Java eine typsichere Sprache ist wird verlangt, dass explizit gecastet wird. Es wird verlangt weil das Downcasten gefaehrlich ist, denn Object o koennte gar nicht von der Klasse A erben und dann wuerde der Cast eine Exception ausloesen. Deswegen brauchst du das if instanceof, dann weisst du, dass du es machen kannst. Da der Ausdruck allerdings nicht zur Compile Time sondern zur Laufzeit ausgewertet wird, kann das der Compiler nicht ueberpruefen. Deswegen expliziter cast.

    *Edit
    Wenn der Compiler intelligent waere, dann wurde es wohl ohne diese expliziten Casts gehen. Aber das koennen Compiler nicht.



  • icarus2 schrieb:

    Wenn der Compiler intelligent waere, dann wurde es wohl ohne diese expliziten Casts gehen. Aber das koennen Compiler nicht.

    Sowas ist IMHO auch nicht die Aufgabe des Compilers, sondern der statischen Codeanalyse, falls vorhanden. Wenn entsprechende Tools mitlaufen, bekäme man ohne vorherige Abfrage bei dem Cast eine Warnung "Possible ClassCastException", mit der if-Abfrage jedoch nicht.



  • Hallo zusammen,

    ich bin auf noch ein Problem gestossen, das eventuell etwas mit "instanceof" zu tun hat. Daher schreibe ich einfach mal in diesem Thread weiter.

    Es geht um folgendes:

    Ich habe drei Klassen A, B und C.

    public abstract class A {
     //...
    } 	
    
    public class B extends A {
      //..
      public int eineVariable;
    }
    
    public class C extends A {
      //..
      public int andereVariable;
    }
    

    Jetzt habe ich eine komplett unabhängige Methode, die außerhalb aller Klassen liegt. Diese Methode bekommt als Parameter eine Instanz der Klasse A.

    public void machWas(A myInstanz) {
    //...
    }
    

    Jetzt habe ich folgendes Problem. Wenn es sich bei "myInstanz" um ein Objekt der Klasse B handelt, so möchte ich den Wert von "eineVariable" ausgeben. Wenn "myInstanz" jedoch ein Objekt von C ist, so möchte ich "andereVariable" ausgeben.

    Wie mache ich das?

    Ich danke euch 😃
    lg, freakC++



  • Ungefaehr so:

    if (myIntance instanceof B) {
         // Mach etwas
    }
    else if (myInstance instanceof C) {
         // Mach etwas
    }
    


  • freakC++ schrieb:

    Ich habe drei Klassen A, B und C.

    public abstract class A {
     //...
    } 	
    
    public class B extends A {
      //..
      public int eineVariable;
    }
    
    public class C extends A {
      //..
      public int andereVariable;
    }
    

    Jetzt habe ich eine komplett unabhängige Methode, die außerhalb aller Klassen liegt. Diese Methode bekommt als Parameter eine Instanz der Klasse A.

    public void machWas(A myInstanz) {
    //...
    }
    

    Jetzt habe ich folgendes Problem. Wenn es sich bei "myInstanz" um ein Objekt der Klasse B handelt, so möchte ich den Wert von "eineVariable" ausgeben. Wenn "myInstanz" jedoch ein Objekt von C ist, so möchte ich "andereVariable" ausgeben.

    Wie mache ich das?

    Kannst es natürlich mit instanceof lösen:

    public void machWas(A myInstanz) {
      if(myInstanz instanceof B) {
        int wert = ((B) myInstanz).eineVariable;
      } else if(myInstanz instanceof C) {
        int wert = ((C) myInstanz).andereVariable;
      }
    
      // irgendwas mit wert
    }
    

    Schöner wäre es, die Methode zu überladen.

    public void machWas(B myInstanz) {
      irgendwasMitWert(myInstanz.eineVariable);
    }
    
    public void machWas(C myInstanz) {
      irgendwasMitWert(myInstanz.andereVariable);
    }
    
    public void irgendwasMitWert(int wert) {
      // ...
    }
    

    Eventuell wäre das aber auch ein Zeitpunkt, dein Design zu überdenken.



  • Das würde aber bedeuten, dass ich alle meine Klassen kennen muss, um diese if Abfrage zu erstellen. Was ist aber wenn ich 100 Klassen habe, die von A erben und jeweils eigene Attribute haben?

    Kann man das auch schöner lösen?

    Danke dir



  • freakC++ schrieb:

    Das würde aber bedeuten, dass ich alle meine Klassen kennen muss, um diese if Abfrage zu erstellen. Was ist aber wenn ich 100 Klassen habe, die von A erben und jeweils eigene Attribute haben?

    Kann man das auch schöner lösen?

    Danke dir

    Dann ist es an der Zeit ein neues Design zu suchen.

    Kommt etwas darauf an was du genau machen moechtest. Aber eventuell waere es nicht schlecht eine abstrakte Methode in der Basisklasse zu deklarieren und diese in den Subklassen zu ueberladen.

    Oder sich ueberlegen ob diese einzelnen Klassen ueberhaupt eine sinnvolle gemeinsame Basisklasse besitzten.

    *Edit
    Was moechtest du denn konkret haben?



  • Spendiere A eine abstrakte Methode "getVariable" und gib in den abgeleiteten Klassen den passenden Wert zurück.


Anmelden zum Antworten