2010-12-09 15 views
4

OK, das ist meine Klasse, es kapselt ein Objekt und delegiert gleich und String an dieses Objekt, warum kann ich keine Instanz von ???Generics und instanceof - Java

public class Leaf<L> 
{ 
    private L object; 

    /** 
    * @return the object 
    */ 
    public L getObject() { 
     return object; 
    } 

    /** 
    * @param object the object to set 
    */ 
    public void setObject(L object) { 
     this.object = object; 
    } 

    public boolean equals(Object other) 
    { 
     if(other instanceof Leaf<L>) //--->ERROR ON THIS LINE 
     { 
      Leaf<L> o = (Leaf<L>) other; 
      return this.getObject().equals(o.getObject()); 
     } 
     return false; 
    } 

    public String toString() 
    { 
     return object.toString(); 
    } 
} 

wie kann ich das zum arbeiten bekommen ?? Danke!

+0

vielleicht meinen Sie nicht Instanceof – dimitrisli

Antwort

10

Aufgrund von type erasure können Sie nur instanceof mit reifiable types verwenden. (Eine intuitive Erklärung ist, dass instanceof etwas ist, das zur Laufzeit ausgewertet wird, aber der Art-Parameter entfernt („gelöscht“) während der Kompilierung.)

Hier ist ein guter Einstieg in Generics FAQ:

+0

SO ein mögliches Update verwenden wäre, diese zu verwenden ??? public boolean equals (Objekt anderes) { if (anderes instanceof Leaf) { Blatt o = (Blatt) anderes; Rückgabe this.getObject(). Equals (o.getObject()); } Rückgabe false; } – fredcrs

+0

Wenn das gut genug für dich ist, dann ja. – aioobe

+2

Wenn Sie betonen möchten, dass 'Leaf' generisch ist, können Sie' andere instanceof Leaf 'verwenden. – musiKk

2

Generische Informationen werden zur Kompilierzeit tatsächlich entfernt und sind zur Laufzeit nicht vorhanden. Dies wird als Typlöschung bezeichnet. Unter der Haube werden alle Ihre Leaf-Objekte tatsächlich zum Äquivalent von Leaf <Object> und zusätzliche Würfe werden bei Bedarf hinzugefügt.

dies Da die Laufzeit kann den Unterschied zwischen Blatt < Foo nicht sagen > und Blatt <Bar> und damit ein instanceof-Test ist nicht möglich.

2

Ich habe ähnliches Problem und löste es durch Reflexion wie folgt aus:

public class Leaf<L> 
{ 
    private L object; 

    /** 
    * @return the object 
    */ 
    public L getObject() { 
     return object; 
    } 

    /** 
    * @param object the object to set 
    */ 
    public void setObject(L object) { 
     this.object = object; 
    } 

    public boolean equals(Object other) 
    { 
     if(other instanceof Leaf) //--->Any type of leaf 
     { 
      Leaf o = (Leaf) other; 
      L t1 = this.getObject(); // Assume it not null 
      Object t2 = o.getObject(); // We still not sure about the type 
      return t1.getClass().isInstance(t2) && 
       t1.equals((Leaf<L>)t2); // We get here only if t2 is same type 
     } 
     return false; 
    } 

    public String toString() 
    { 
     return object.toString(); 
    } 
}