Wann wird Eclipse Java 1.5 unterstüzen?


  • Mod

    Optimizer schrieb:

    new T()? Geht leider nicht.

    Dann mußt du an der Stelle wohl mit Reflection arbeiten. Ist doch auch nicht so schlimm, oder?


  • Mod

    Man könnte sich z.B. eine Methode in folgender Art basteln:

    public class CreateInstanceTest
    {
       public CreateInstanceTest ()
       {
       }
    
       public static void main (String [] args)
       {
          CreateInstanceTest test = createInstance(CreateInstanceTest.class);
       }
    
       public static <Type> Type createInstance (Class<Type> typeClass)
       {
          try
          {
             return typeClass.newInstance();
          }
          catch (IllegalAccessException e)
          {
          }
          catch (InstantiationException e)
          {
          }
          return null;
       }
    }
    


  • Naja, find ich jetzt nicht so unglaublich "weich". 😉
    Mich stört ein bisschen die Technik dahinter. Bei den Containern z.B. ändert sich nichts, die verwalten immer noch Objects, nur dass halt der Compiler die ganzen Casts einfügt und man selber sich nicht mehr darum kümmern muss.
    Klar, jetzt ist es auf jeden Fall sicher und bequemer, aber trotzdem stört mich diese Vorgehensweise bei den Generics etwas. Vor allem, wenn der cast da intern immer noch drinsteht, muss die VM also praktisch jedesmal nen Typcheck machen. Und primitive Typen werden jedesmal geboxt.

    Naja, bringt nichts, da rum zum jammern, ich finds halt ein bisschen schade...


  • Mod

    Ok, ich finde es auch nicht gerade optimal gelöst. Solche suboptimalen Implementierungen sind wohl der Preis, wenn man halbwegs kompatibel bleiben möchte.

    Das "new T()" nicht geht, halte ich persönlich aber nicht für wichtig. Es wäre auch mit dem restlichen Java nicht kompatibel, weil man nirgendwo angeben kann, dass eine Klasse einen parameterlosen Konstruktor anbieten muss.

    PS: Man kann natürlich mehr machen als nur rumjammern. Zum Beispiel könnte man für RFE 4487555 stimmen.



  • weil man nirgendwo angeben kann, dass eine Klasse einen parameterlosen Konstruktor anbieten muss.

    naja ich dachte da eher an ein System wie bei den C++ Templates. Das Ding wird compiliert, und wenn man das dann mit einem bestimmten Typ instanziert (zur Compilierzeit!), wird halt ggf. gemeckert. Würde ich auf jeden Fall in vielerlei Hinsicht besser finden. 👍

    Was ist das RFE 4487555 genau? Ich hab dazu nur einen Google-Treffer.


  • Mod

    Optimizer schrieb:

    naja ich dachte da eher an ein System wie bei den C++ Templates. Das Ding wird compiliert, und wenn man das dann mit einem bestimmten Typ instanziert (zur Compilierzeit!), wird halt ggf. gemeckert. Würde ich auf jeden Fall in vielerlei Hinsicht besser finden.

    Fände ich absolut scheiße. Java ist eben kein C++ und so ein Vorgehen würde mit dem Rest von Java überhaupt nicht harmonieren.


  • Mod

    Optimizer schrieb:

    Was ist das RFE 4487555 genau? Ich hab dazu nur einen Google-Treffer.

    In dem Google-Treffer steht doch schon der Link:

    http://developer.java.sun.com/developer/bugParade/bugs/4487555.html



  • *lol* was hattest du für einen Google-Treffer??

    Inwiefern würde das mit dem Rest von Java nicht harmonieren? Ich rede nicht davon, die getrennte Übersetzung aufzugeben. Meine Idee wäre, die generische Klasse als Schablone zu compilieren und wenn man sie dann irgendwann mal benutzt, soll der Compiler die Schablone dann als Muster für die Instanzierung nehmen und daraus eine eigene Klasse erstellen, z.B. Vector<String>.class.
    Die Abhängigkeit beim Compilieren wäre auch nicht größer, als wenn eine Klasse die andere braucht. Wenn ich die Klasse xyz nutze, muss sie halt vorhanden sein und das wäre hier das selbe.
    Aber so wie es jetzt steht, wird die generische Klasse direkt benutzt und überall typecasts und boxing hingesetzt. Find ich nicht so weich.

    Ok, aber immerhin muss man den Generics zugute halten, dass man den Parameter-Typ einschränken kann mit extends und implements.


  • Mod

    Optimizer schrieb:

    Meine Idee wäre, die generische Klasse als Schablone zu compilieren und wenn man sie dann irgendwann mal benutzt, soll der Compiler die Schablone dann als Muster für die Instanzierung nehmen und daraus eine eigene Klasse erstellen, z.B. Vector<String>.class.

    Ok, wenn eine Klasse von mir 10 verschiedene Vectoren nutzt, dann sollen also 10 zusätzliche Class-Dateien erzeugt werden, die entsprechend zur Laufzeit alle geladen werden müssen? Das kann ja wohl wirklich nicht die Lösung sein.

    Meine Idee wäre, nur die Schablonen abzuspeichern und die entsprechenden konkreten Klassen erst zur Laufzeit von der JVM erzeugen zu lassen.



  • So wie ich die Generics verstanden habe wird doch gerade das gemacht? Generics werden ähnlich wie bei C oder C++ von einer Art Präprozessor als solche erkannt und als Template wird dann eine Klasse textuell generiert (im Speicher) und diese dann kompiliert so dass das spätere Kompilat beispielsweise bei einer ArrayList genau x Varianten hat - nämlich die x Varianten, die in meinem Code verwendet wurden. Sehe ich das falsch?


  • Mod

    CengizS schrieb:

    Sehe ich das falsch?

    Ja. Auf der Ebene von Class-Dateien entsprechen generische Java-Klassen AFAIK einfachen Klassen. Da, wo Typparameter vorhanden sind, wird einfach der Typ Object verwendet oder ein anderer Typ, wenn man bei den Typparametern Einschränkungen angegeben hat. Generics existieren bei Java also nur auf Ebene des Javacodes. Auf Bytecode-Ebene sind sie nicht vorhanden.



  • Wenn du zum Beispiel einen Vector<String> verwendest, hast du in Wirklichkeit einen Vector<Object> und wenn du Vector.elementAt(x).length sagst, macht der Compiler (String)(Vector.elementAt(x)).length draus.

    Deshalb sind da lauter sinnlose, ineffiziente typecasts drin, und deshalb geht das natürlich auch nicht mit primitiven Typen. Das einzige was man wirklich gewinnt, ist, dass der Code schöner ist und natürlich sicher ist, so ein Typecast wird niemals fehlschlagen. Aber durchgeführt wird er IMO trotzdem, oder?



  • Optimizer schrieb:

    Aber durchgeführt wird er IMO trotzdem, oder?

    nein



  • test2 schrieb:

    nein

    DOCH! 😡 😉



  • Gregor@zuHause schrieb:

    test2 schrieb:

    nein

    DOCH! 😡 😉

    eben net! der wird auto geboxt und das geht ohne cast ⚠



  • test2 schrieb:

    Gregor@zuHause schrieb:

    test2 schrieb:

    nein

    DOCH! 😡 😉

    eben net!

    eben DOCH! :p Das hat garnichts mit Autoboxing zu tun.


Anmelden zum Antworten