getClass() Frage!?



  • Ich hab folgendes Problem:

    interface IDummy
    {}
    
    class Foo  implements IDummy
    {}
    
    IDummy tmp = new Foo();
    

    tmp.getClass() => liefert mir hier "Foo" statt" IDummy" als "Class" object!
    Wieso? gibts da ne möglichkeit?
    Ist aller ding doof, da ich generische Constructor aufrufe machen will...


  • Mod

    Die Klasse Class bietet Dir Methoden, um auf die verschiedenen Konstruktoren zugreifen zu koennen. Wenn Du weisst, welche Parameter Du dem Konstruktor uebergeben moechtest, dann kannst Du damit direkt an den entsprechenden Konstruktor herankommen und mit dem dann ein entsprechendes Objekt erzeugen.

    So ein Vorgehen garantiert Dir allerdings nicht zur Compilezeit, dass ein entsprechender Konstruktor auch vorhanden ist.

    Jenseits davon: Seit wann definiert man in einem Interface Konstruktoren? Das sollte nicht moeglich sein.

    Aber ich glaube, ich habe Dich irgendwie falsch verstanden. Kannst Du noch mal etwas ausfuehrlicher sagen, was Du eigentlich machen moechtest?



  • Servus,

    nein du hast mich falsch verstanden:)

    folgends: (Pseudo):

    class Bar
    {
       public Foo(IDummy arg){...}
    }
    
    IDummy tmp = new Foo();
    
    Bar obj=   Bar.class.getConstructor(tmp.getClass()).newIntance(tmp);
    

    in meiner Factory bei getConstructor fliegt er auf die Schnautze, da er statt IDUmmy ein Foo Class interpretiert!

    später will ich eben verschieden implementationen für IDummy angeben können!


  • Mod

    1. Wie schon gesagt: Interfaces bieten keine Konstruktoren. Deswegen kannst Du nicht ueber das Interface Objekte instanziieren.

    2. Falls Du an die Interfaces herankommen moechtest, die von einer Klasse implementiert werden, dann bietet Dir die Klasse Class dafuer die Methode getInterfaces. Was immer Du mit Interfaces machen moechtest, was auch mit ihnen funktioniert, kannst Du darueber machen.

    3. Natuerlich wird Dir die Klasse Foo zurueckgeliefert. tmp ist nunmal ein Foo. Weiter oben steht ja schon, wie Du an die Interfaces herankommen kannst. Auch an Superklassen kannst Du aehnlich herankommen.



  • Seit Java8 können auch Interfaces Methoden implementieren, vielleicht auch einen Konstruktor?



  • Die Methode getClass() liefert Dir immer den Laufzeittyp des Objekts. Das ist ja gerade der Sinn dieser Methode, sonst könntest Du im konkreten Fall ja auch IDummy.class statt tmp.getClass() nutzen.

    Was spricht gegen new Bar(tmp)? 😉

    Mögliche Lösung (möglicherweise die einzig brauchbare) wäre hier, alle Konstruktoren von Bar.class zu betrachten und denjenigen zu suchen, der genau einen Parameter hat und für dessen Parametertyp.class.isAssignableFrom(tmp.getClass()gilt.


Anmelden zum Antworten