2010-01-29 10 views
16

Was ist das Java-Äquivalent von C++ - Vorlagen?Was ist das Java-Äquivalent von C++ - Vorlagen?

Ich weiß, dass es eine Schnittstelle namens Vorlage gibt. Ist das verwandt?

+0

Ich habe versucht, Ihre Frage neu zu formulieren, um sie verständlicher zu machen. Fühlen Sie sich frei, meine Änderungen rückgängig zu machen, wenn Sie das Gefühl haben, dass sich die Frage in etwas anderes geändert hat. – jalf

+1

@ jalf: hey irrtümlich ich rollte zurück .. kann man es wieder untermaßbarer machen? – giri

+0

@girnie, ich rolle es zurück zu jalfs Änderungen für Sie – Trent

Antwort

44

Templates wie in C++ gibt es nicht in Java. Die beste Annäherung ist generics.

Ein großer Unterschied ist, dass in C++ diese legal ist:

<typename T> T sum(T a, T b) { return a + b; } 

Es in Java kein Äquivalent Konstrukt ist. Das Beste, was man sagen kann, ist

<T extends Something> T Sum(T a, T b) { return a.add(b); } 

wo Something ein Verfahren add genannt hat.

In C++, was passiert ist, dass der Compiler erstellt eine kompilierte Version der Vorlage für alle Instanzen der Vorlage im Code verwendet. Wenn wir also

int intResult = sum(5, 4); 
double doubleResult = sum(5.0, 4.0); 

dann die C++ Compiler haben eine Version von sum für int und eine Version von sum für double kompilieren. In Java gibt es das Konzept erasure. Was passiert ist, dass der Compiler alle Verweise auf die generischen Typparameter entfernt. Der Compiler erstellt nur eine kompilierte Version des Codes unabhängig davon, wie oft er mit verschiedenen Typparametern verwendet wird.

Weitere Unterschiede

+0

Ihr C++ Beispiel kann nicht kompilieren, wenn Sie versuchen, es einen Typ übergeben, der keine Zugabe definiert hat. Genau wie Ihr Java-Beispiel, mit der Methode add. Ihr Beispiel veranschaulicht keine Unterschiede zwischen den Vorlagen, aber das Fehlen eines Überladens des Operators in Java. Ansonsten, gute Antwort :) – gnud

+5

@gnud: Das ist richtig, aber es gibt einen feinen Unterschied. In C++ ist die Vorlage, die ich oben geschrieben habe, ohne Beschränkung auf 'T' legal; es ist nur, wenn Sie versuchen, es mit einem Typ zu verwenden, der nicht '+' definiert hat, wird es einen Fehler geben. In Java gibt es kein Äquivalent. Also in C++ können Sie sagen "define' sum' für alles, was '+' hat. " In Java kann man das nicht sagen; Sie können nur angeben, dass 'T'' Something' erweitert, das eine 'add'-Methode hat. Wenn Sie also ein 'U' haben, das' Something' nicht erweitert, aber eine 'add' Methode hat, können Sie die oben definierte' sum' nicht für Instanzen von 'U' verwenden. – jason

+2

C++ erlaubt irgendwie die Begrenzung von Typparametern, aber auf eine sehr umständliche Weise. Wenn eine Vorlagenerweiterung aus bestimmten Gründen fehlschlägt, wird sie aus der Liste der Kandidatenerweiterungen entfernt. Dies wird SFINAE (Substitutionsfehler ist kein Fehler) in der C++ - Community genannt. Sie können dies verwenden, um Zeitintrospektion auf Klassen zu kompilieren und bestimmte Dinge in eine Richtung und andere Dinge zu erweitern. – Omnifarious

0

Java hat Generika, die ähnlich, aber nicht genau das gleiche wie Vorlagen. Ich weiß nicht, was die Template-Oberfläche ist, aber es hat nichts mit C++ - Templates zu tun.

5

In Java gibt es keine echten Vorlagen. C++ - Vorlagen sind Kompilierzeiteinheiten, die zum Generieren von Klassen verwendet werden. Zur Laufzeit gibt es keine Spur von ihnen.

In Java gibt es parametrisierte Typen als Teil eines Mechanismus namens Generika. Es dient einem ähnlichen Zweck, unterscheidet sich aber erheblich in seiner Funktionsweise und seinen Auswirkungen.Es hat einige Repräsentation zur Laufzeit, gibt es bestimmte Regeln, etc.

Beginnen Sie mit dem Lesen der Java tutorial, dann lesen Sie Blochs Effektive Java für eine detaillierte Beschreibung der Vorbehalte, wenn Sie ein "Power User" werden wollen.

+0

Der erste Absatz ist wahrscheinlich die prägnanteste Erklärung der Vorlagen, die ich gesehen habe. +1 für das allein. :) – jalf

0

Es gibt keinen eingebauten Template-Mechanismus in Java. Stattdessen haben sie Generika. Darüber hinaus haben Ides etwas, das Code-Vorlagen genannt wird, z. für eclipse.

0

Sie benötigen keine Vorlagen in Java. Vorlagen sind hauptsächlich nützlich, wenn Sie völlig unterschiedliche Typen als Parameter haben müssen, von denen Sie nichts wissen. In Java sind alle Objekte virtuell und erben von einem Root-Objekt, und primitive Typen werden viel klarer definiert und Casts funktionieren auf eine sinnlichere Art und Weise, so dass es keinen Sinn mehr darauf gibt.

Sie können bessere Leistung mit C++ - Vorlagen erzielen, aber aufgrund der Art und Weise, wie sie viel mehr Code generieren und die schnelle CPU-Geschwindigkeit die Datenzugriffsgeschwindigkeit jedes Jahr mehr und mehr übersteigt, ist dies immer seltener der Fall zu Objekten im Gegensatz zu Primitiven.

+0

@charles schrieb "... sie erzeugen viel mehr Code ...". Das ist eine Überallgeneralisierung. Jedes Sprachmerkmal kann irgendwie missbraucht werden. Wenn Sie wissen, was Sie tun, werden Sie keine Probleme mit Code Bloat haben. Außerdem ist der kompilierte C++ - Code nicht mit der Menge an Metadaten verstopft, die in Java als "dynamischer" bezeichnet werden. Aber ich stimme deinem ersten Satz zu. Mit Laufzeit-Polymorphismus + Garbage Collection können Sie ziemlich weit kommen. Leistung wird nur ein bisschen saugen. – sellibitze

+0

Nun, das einzige Mal, dass sie nicht mehr Code generieren, ist, wenn Sie nur einen Typ haben, der von einer Vorlage verwendet wird, und nur eine Objektdatei, die die Vorlage verwendet. Ich möchte nicht sagen, dass ich nie Templates verwende, da C++ Sie dazu zwingt, aber sie werden nicht so viel Leistungsverbesserung gegenüber Java haben, wie die meisten Leute denken, und auch eine Menge Komplikationen hinzufügen. –

+0

es hängt von dem Feld und Ihrer Codierung Stil, wenn Sie mit einigen Programmen, die mit einer Menge von primitiven Arten wie Bildverarbeitung versauen müssen, müssen Sie eine lof "Funktor" inline, Vorlage ist ein Weg zu gehen. Im Bereich der Bildverarbeitung verwenden wir immer mehr Binärraum, um mit Geschwindigkeit zu handeln.Außerdem könnte Kompilierungszeit-Polymorphie die Abhängigkeit verringern, da die Vererbung eine sehr starke Beziehung innerhalb der Klassen erzwingt, ich hasse es, wenn ich es nicht brauche, aber Java und OO nur die Sprache zwingen mich dazu – StereoMatching