Diskussion:Generische Programmierung in Java

Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 20. März 2006 um 16:17 Uhr durch 84.174.123.69 (Diskussion) (Abschnitt Kovarianz). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Grats an diejenigen, die diesen Artikel verfasst haben. Wirklich gelungen und auf den ersten Blick (wahrscheinlich auch den zweiten usw.) vollständig :) --ChristianHujer 05:25, 14. Mär 2005 (CET)

Weiterhin ist es aufgrund dieser Vorgehensweise bei C++ sehr problematisch, virtuelle Methoden im Zusammenhang mit Templates zu verwenden

Inwiefern?

(beispielsweise dürfen Methoden einer template-Klasse nicht virtuell sein).

Bullshit. Aragorn2 20:40, 26. Mär 2005 (CET)
Worauf der Autor sich vermutlich unbewusst bezog, ist, dass Template-Methoden nicht virtuell sein dürfen. Bsp.:
template<typename A, typename B> class Foo {
public:
    virtual B bar(A someParameter) { /*...*/ }   // ok
};
Aber:
class Is_a_Everything {
public:
    template<typename ConvertTo>
    virtual operator ConvertTo() const = 0;   // Fehler: virtuelle Template-Methode
};
Siehe [Stroustrup, The C++ Programming Language, 3rd edition, Addison Wesley 2000, Abschnitt 13.6.2]
Nachdem Java auch mit der sogenannten Version "5.0" keine generischen Funktionen vorsieht (nur Methoden generischer Klassen), ist das ein Problem, dass in Java schon allein aufgrund der fehlenden Ausdruckskraft der Sprache gar nicht auftreten kann. Constraints sind eine sinnvolle Ergänzung (in C++ kann man sie bisher nur über Template-Metaprogrammierung simulieren), die restlichen Einschränkungen von Java Generics gegenüber C++ basieren aber nicht auf (angeblichen) Schwächen von C++-Templates, sondern Beschränkungen der Sprache "Java", und des dazugehörigen Runtime Supports. Ich werde den falschen und irreführenden Kommentar daher entfernen. Aragorn2 21:13, 26. Mär 2005 (CET)
Nochmal zur Klarheit: Im ersten Fall besitzt eine Template-Klasse eine virtuelle Methode. Das ist in C++ vollkommen zulässig. Im zweiten Fall besitzt eine Klasse (Template oder nicht) eine Schar von Methoden die über ein geschachteltes Template parameterisiert ist. Diese Methodenschar darf laut C++-Standard nicht "virtual" sein. Dieser Fall ist etwas völlig anderes als der erste, und ist mit Java nicht vergleichbar, weil es in Java zwar generische "Klassenscharen" gibt, aber keine "Funktionsscharen".
Zulässig ist es in C++ jedoch nachwievor, Klassen mit Scharen nicht-virtueller Methoden zu versehen, Beispiel:
template<class Encapsulated> class Encapsulate {
private:
    Encapsulated m_object;

public:
    template<class ConvertTo>
    operator ConvertTo() const {  // ok: Schar nicht-virtueller Methoden
        return m_object;
    }
};
Zu diesen dürfen auch wie üblich teilweise und vollständige Spezialisierungen angegeben werden. Eine derartige Funktionalität existiert in Java 5.0 nicht. Aragorn2 23:58, 26. Mär 2005 (CET)

Abschnitt Kovarianz

Laut des Buches "Java ist auch eines Insel" gilt die genannte Vererbung im Abschnitt Covarianz nicht. Vielleicht verstehe ich hier auch etwas falsch, aber es liest sich im Artikel so, als würde aus T extends V automatisch Typ<T> extends Typ<V> folgen. Dies gilt jedoch nicht. In Java ist auch eine Insel steht:

"In Zusammenhang mit Generics und Vererbung muss beachtet werden, dass die übliche Substitution nicht funktioniert. Wenn Disko eine Unterklasse von Gebaeude ist, so ist Box<Disko> keine Unterklasse von Box<Gebaeude>, genauso wie Box<Object> nicht die Basisklasse von Box<Gebaeude> ist, beziehungsweise eine Box, die alle erdenklichen Typen ermöglicht.

Der Compiler meckert diesen Versuch sofort an.

Box<Object> box; box = new Box<Disko>(); // incompatible types"

Siehe hierzu http://www.galileocomputing.de/openbook/javainsel4/javainsel_06_012.htm#Rxx365java06012040001D41F0321BE Kapitel 6.13.3