C++ Java Generics - C++ Templates | Was passiert da genau?

Zeboo

Lt. Commander
Registriert
Juli 2008
Beiträge
1.562
Hallo.

Habe mal paar kleine Fragen zu den Generischen Typen in Java und C++ und vorallem möchte ich wissen wie das abläuft.

Also das was ich bisher verstanden habe, und falls etwas falsch ist korrigiert mich bitte, ist:
Java Generic, man kann nicht mit primitiven Typen arbeiten. Nur mit Objekten, Java generiert später aus dem ganzen Genericzeug eh ein eigenenes neues Objekt. In C++ dagegen geht alles. Weil? Und vorallem was macht da der Compiler? Der macht ja kein neues Objekt, der erzeugt einen neuen Code mit dem passenden Typ oder? Oder wie muss ich das verstehen?

Gruß
 
Klingt wirr was du da schreibst. Der Unterschied ist ganz einfach.

Java Generics: Der Typparameter ist _immer_ ein Objekt (mit Basisklasse Object). Beim Compilen wird der Typparameter zu Object gecastet und das ganze kompiliert. Wenn du so eine Klasse dann mit einem Typparameter != Object instantierst, dann werden dynamisch Typprüfungen durchgeführt. Die Basistypen (int, float, ..) sind aber keine Objekte vom Typ Object, deswegen gehen die nicht.

C++ Template: Das funktioniert völlig anders als bei Java. Der Compiler erstellt statisch für jeden Typparameter den du verwendest einen eigenen Maschinencode. d.h. wenn du z.B. eine Templateklasse template <class T> class Bla {}; hast und du diese einmal mit Bla<int> und einmal mit Bla<char> instantiierst, dann erstellt der Compiler _zwei_ Klassen in Form von Maschinencode daraus. Diese kriegen dann bestimmte Namen, die sich durch das Mangling ergeben, d.h. es sind zwei verschiedene Klassen mit unterschiedlichen Namen.
Es wird also quasi symbolisch der Typparameter substituiert und die Klasse dann dafür kompiliert. Deswegen kannst du in C++ Templates mit jedem beliebigen Typparameter erstellen.
 
Danke hört sich verständlich an
 
Hallo IceMatrix,

danke für deine Antwort.

Bezüglich den Generics, sind da wirklich Typüberprüfungen notwendig, von z.B. List<Integer>. Ich meine, ist es überhaupt notwendig dass der Integer value in einen Object gecastet wird?
Integer ist ja ohnehin ein Subtyp von Object.

Der Grund warum ich das Nachfrage ist, dass ich eine Ausarbeitung bezüglich Generics erstellt habe, hab aber von der Typüberprüfung nichts erwähnt.
Wenn die Typüberprüfung wirklich notwendig ist, dann wäre ich für ein diesbezügliches Dokument, von Oracle oder so, natürlich sehr erfreut :)

Vielen Dank und lg,
 

Ähnliche Themen

Zurück
Oben