Sinn hinter Generic?

  • Themenstarter Themenstarter LasagneLegga
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
L

LasagneLegga

Gast
Hallo,
Ich hätte mal eine Frage zum Thema Generic, genauer gesagt:
Wo liegt der Sinn dahinter? 🙂

Bei C++ kann ich es ja noch verstehen, dort erbt nicht jede Klasse (bzw. nicht "alles"* ist eine Klasse), sodass man nicht so einfach eine Untermenge aller Typen hat.
Aber bei Java erbt alles* von Object, dazu kommt das am Ende die generischen Typen (also nach dem compilieren) afaik eh nach Object gewandelt wird, was auch der Grund ist warum man es per Hand wieder zurückkonvertieren muss (oder irre ich mich?).
Hier verstehe ich auch warum C# Generic hat, dort läuft das afaik zur RunTime ab und man sparrt sich das manuelle Konvertieren.
Wenn ich In der generischen Klasse bestimmte Methoden benutzen will die der Typ zu implementieren hat, dann nehm ich halt nicht einfach Object sondern erstelle mir ein passendes Interface.

Also warum Generic (also konkret: Arbeiten mit einem Parameter T), anstatt direkt mit Object / dem passendem Interface?

* Ich weiß das in Java die primitiven Datentypen keine Objekte sind, aber es gibt ja die entsprechendenWrapper, die afaik ja auch bei Generic benutzt werden. Man siehts nur nicht dank autoboxing.
 
Wenn man einen Typ T angibt, muss man den nicht mehr von Objekt nach T konvertieren, das ist dann klar, dass jedes Argument das übergeben wurde von diesem Typ T ist.
 
Die Generics helfen vorallem z.B bei Listen, Wenn du eine Liste hast, die nur den einen Bestimmten type der Variable aufnehmen soll, dann kann man das mit generics ganz leicht Bewerkstelligen ohne wirklich zusätzlichen Code schreiben zu müssen.

Der compiler überprüft dann zur Kompilezeit ob alle Variablen die du in die Liste steckst vm richtigen Typ sind.

Wenn du nun wieder Werte aus der Liste nehmen möchtest kannst du dir dann bei Generics das casten auf den richtigen Typ sparen, da auch das der Compiler für dich schon zur Compilezeit macht

im prinzip sind Generics nichts anderes als ein Mechanismus zur Typsicherheit
 
@TO: Wenn du's nicht glaubst, hier ein Beispiel:
Java:
class Foo {
    public static void main(String[] args) {
        List<Foo> l = new ArrayList<Foo>();
        l.add(new Foo());
        l.get(0).bar();
    }
    public void bar() {
        System.out.println("alles io");
    }
}
 
Ah ok,
typsicherheit und das doch implizit konvertiert wird, sind natürlich zwei gute Argumente für Generic. 🙂

Eine kurze Frage noch hinterher:
Wo liegt dann der Vorteil von Generic zur Laufzeit (wie es C# hat), gegenüber Generic zur Compilezeit?
 
Die Konzepte sind grundlegend verschieden. Die Templates von C++ sind mächtiger, aber auch komplizierter.

Generics sind auch kompliziert, aber einfacher als Templates, sie decken aber auch nicht die Möglichkeiten von Templates ab.

Der Hauptunterschied ist, dass bei Java zur Laufzeit keine Informationen über die Typeparameter mehr verfügbar sind. Dies wird sich aber vielleicht in der Zukunft ändern.

Bei Java werden die Typeparameter beim Compilen entfernt, die Prüfung erfolgt also zur Compilezeit. Bei C++ werden die Klassen beim Compilen für den entsprechenden Typ übersetzt.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben