Ableiten von Typ "T"

BobHarris

Mitglied
Hallo,
der Titel ist vielleicht etwas verwirrend oder nichts aussagend. In C++ könnte ich folgendes schreiben.
[CODE lang="cpp" title="C++"]
template<class T>
class Foo : public T
{
//...
};
Foo<Bar>* foo = new Foo<Bar>();
Bar* bar = static_cast<Bar*>(foo);
[/CODE]

Wie kann ich das in Java bewerkstelligen bzw. geht das überhaupt ?
[CODE lang="java" title="Java"]public class Foo extends <T.... ?> { // Gibt es diese Möglichkeit überhaupt in Java ?

}[/CODE]

Gibt es so eine Möglichkeit in Java bzw. kann man das nachbilden ?

Vielen Dank.
 

Barista

Top Contributor
public class Foo extends <T.... ?> { // Gibt es diese Möglichkeit überhaupt in Java ? }

Wie kann ich das in Java bewerkstelligen bzw. geht das überhaupt ?
Java:
public class Foo extends <T.... ?> { // Gibt es diese Möglichkeit überhaupt in Java ?

}
Gibt es so eine Möglichkeit in Java bzw. kann man das nachbilden ?

In Java gibt es keinen magischen THIS-Typ-Parameter.

Aber eine rekursive Notation ist möglich:

[CODE lang="java" title="Rekursive Notation eines Typ-Parameters"]public interface Comparable<T> {

public int compareTo(T o);

}[/CODE]

Dies sichert ab, dass die Methode compareTo nur mit einem passendem Exemplar der aktuellen Klasse aufgerufen werden kann.

Da dies reflexiv funktionieren muss

[CODE lang="java" title="Java reflexiv"]a.compareTo( b ) == -b.compareTo( a ) // hier ohne Normalisierung auf -1, 0, +1[/CODE]

kann man das Interface Comparable eigentlich nur in finalen oder faktisch finalen Klassen (ist nicht final, es gibt aber keine Kindklassen) implementieren.
 

Flown

Administrator
Mitarbeiter
Es gibt schon was, was dem nahe kommt nur nicht in die Richtung wo du gerne hinmöchtest:
Java:
class Foo<T extends Foo<T>> {}

class Bar extends Foo<Bar> {}

// kannst du dann sowas machen
Bar foo = new Bar();
Foo<Bar> bar = foo;
// soetwas geht nicht:
Bar fb = new Foo<Bar>();
 

Barista

Top Contributor
Falls Du aber über die Oberklasse eine Funktionalität injekten willst, solltest Du bei Depency Injection nachschlagen.

Dabei ist es leider so, dass Delegation (Injektion) statt Vererbung zwar als architektonisch besser angesehen wird, aber leider schlechtere Performance bietet(keine kostenlose Abstraktion, als C++ler weisst Du was ich meine).
 

mrBrown

Super-Moderator
Mitarbeiter
Dabei ist es leider so, dass Delegation (Injektion) statt Vererbung zwar als architektonisch besser angesehen wird, aber leider schlechtere Performance bietet(keine kostenlose Abstraktion, als C++ler weisst Du was ich meine).
Bevor das jetzt noch jemand falsch versteht und Vererbung gegenüber Komposition bevorzugt: "schlechtere Performance" meint dabei in sehr vielen Fällen 1-2 CPU-Instruktionen mehr, was in nahezu keiner Applikation überhaupt messbar ist.
 

BobHarris

Mitglied
Hallo, vielen Dank für die Antworten. Irgendwie sind die Meldungen aus dem Forum wieder im Spam-Ordner gelandet. Hatte mich jetzt nochmal in die Thematik etwas eingelesen. Kann ja evlt. auch daran liegen, das Java und C++ Templates unterschiedlich handhaben. In C++ wird das zur Kompilierzeit ausgewertet und in Java ist das zur Laufzeit ( ? ). Gruß & Danke.
 

BobHarris

Mitglied
G
Was genau willst du denn damit erreichen?
Dem FXMLLoader in Java übergibt man einen Controller. Wenn das UserControl in fx:root eingebettet ist wird darin noch der zu erwartende Typ angegeben z.B.
Java:
<fx:root type="BorderPane"... >

D.h. die entsprechende Controller Klasse muss dann von BorderPane erben. Um das generisch zu halten, hätte sich dieses Konstrukt aus C++ angeboten.

Grüße,
 

mrBrown

Super-Moderator
Mitarbeiter
Kann ja evlt. auch daran liegen, das Java und C++ Templates unterschiedlich handhaben.
Liegt nir nicht an der unterschiedlichen Handhabung, sondern eher daran, dass Java Generics und C++ Templates zwei völlig unterschiedliche Konzepte sind und völlig anders funktionieren :)

Die Gemeinsamkeiten dürften sich fast darauf beschränken, dass beide „ähnlich“ aussehen und man damit zT etwas ähnliches erreichen kann (typisierte Collections zB).


In C++ wird das zur Kompilierzeit ausgewertet und in Java ist das zur Laufzeit ( ? ).
Durch Erasure sind Generics zur Laufzeit nicht mehr wirklich vorhanden, die sind nur fürs Typechecking zur Compilezeit da (Ausnahmen bestätigen wie immer dir Regel).
 

Ähnliche Java Themen

Neue Themen


Oben