Warum nicht Java brauchen Operator Überladen?
Warum nicht Java brauchen operator überladen? Gibt es eine Möglichkeit, es kann sein, unterstützt die in Java?
Nur weil es nicht eine Funktion bedeutet nicht, dass Sie es nicht brauchen. Java ist eine einfache (relativ) Sprache. Operator überladung ist wohl eines der komplexesten Merkmale der Sprachen, die es erlauben (vielleicht mit Ausnahme von Mehrfachvererbung)
In der CLR-operator überlädt, ist nur syntatic Zucker für den Aufruf einer statischen Methode (z.B. op_Add, op_Concatenate, etc). Von dem, was ich gelesen habe, der Hauptgrund, ist es schwer, in C++ ist es, herauszufinden, wie man mit der Erinnerung.
Siehe auch stackoverflow.com/questions/2629501/... und stackoverflow.com/questions/77718/java-operator-overload
Java enthält sehr viel komplexere Funktionen als-operator überladen (innere Klassen, autoboxing, generics). In der Tat, wenn es nicht für autoboxing, operator-überladung Hinzugefügt werden könnten, in einem völlig rückwärts kompatibel Art und Weise.
Bitte erläutern Sie, wie autoboxing ist die einzige Sache, die verhindern operator-überladung. C++ hat den Gegenwert von autoboxing (implizite Konvertierungen) als auch als operator zu überladen.
In der CLR-operator überlädt, ist nur syntatic Zucker für den Aufruf einer statischen Methode (z.B. op_Add, op_Concatenate, etc). Von dem, was ich gelesen habe, der Hauptgrund, ist es schwer, in C++ ist es, herauszufinden, wie man mit der Erinnerung.
Siehe auch stackoverflow.com/questions/2629501/... und stackoverflow.com/questions/77718/java-operator-overload
Java enthält sehr viel komplexere Funktionen als-operator überladen (innere Klassen, autoboxing, generics). In der Tat, wenn es nicht für autoboxing, operator-überladung Hinzugefügt werden könnten, in einem völlig rückwärts kompatibel Art und Weise.
Bitte erläutern Sie, wie autoboxing ist die einzige Sache, die verhindern operator-überladung. C++ hat den Gegenwert von autoboxing (implizite Konvertierungen) als auch als operator zu überladen.
InformationsquelleAutor pure.java | 2010-08-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java erlaubt nur die arithmetischen Operationen auf den elementaren numerischen Typen. Es ist ein gemischter Segen, da obwohl es bequem zu definieren Operatoren, die auf andere Arten (wie komplexen zahlen, Vektoren etc), es gibt immer von der Implementierung abhängige Eigenheiten. Damit die Betreiber nicht immer das, was Sie von Ihnen erwarten. Durch die Vermeidung von operator überladen, es ist mehr transparent, welche Funktion aufgerufen wird wenn. Ein weiser design bewegen sich in einigen Menschen die Augen.
Sie nur vergessen BigInteger und BigDecimal 🙁
Was noch schlimmer ist, Sie haben es falsch. Sowohl C# - und Java-Nutzung + sowohl für die addition und die Verkettung so erhalten wir seltsame Art Zwang bugs. Sie gleichen Fehler, die Visual Basic gelöst halbes Jahrzehnt vor Java entstand durch die Spaltung von Ihnen in zwei Operatoren.
Es ist erwähnenswert, dass die Menschen immer verwirrend variable Namen, wie xyzzy. Die einfache Tatsache, dass Menschen eine Sprache verwenden Funktion zu schreiben, obfuscated code sollte nicht für sich allein betrachtet werden, einen legitimen Grund, um zu vermeiden, dass die Funktion, insbesondere, wenn dieses feature kann verwendet werden, um more lesbaren code, wenn es verwendet wird, in den richtigen Kontext. Ich finde es traurig, dass der einzige wirkliche Grund, nicht mit Java für Probleme, deren Lösung könnte sein, die meisten aus mathematisch ausgedrückt (und es ist keine kleine Zahl von Ihnen), ist nur, weil die Entwickler nicht wollen-operator überladen.
Aus der Logik dieser Antwort - Methode-Namen können irreführend sein, warum können Programmierer geben die Methoden einen Namen? Lasst uns einfach aufzuzählen, mit zahlen!
InformationsquelleAutor Sanjay Manohar
Java nicht "müssen" - operator überladen, weil keine Sprache muss.
a + b
ist nur "syntaktischer Zucker" füra.Add(b)
(tatsächlich, einige würden argumentieren, dassa.Add(b)
ist nur syntaktischer Zucker fürAdd(a,b)
)add
sollte nicht groß geschrieben werden.Ich spreche nicht Java-spezifisch, aber für Sprachen im Allgemeinen. Zum Beispiel in Java, das können Sie nicht haben die keine Funktion Add(a,b)
Sie können eine statische Methode, die im wesentlichen die gleichen.
Lesen Sie diese:
a.add(b.minus(h).multiply(d.divide(i.add(j))).add(e)).add(c.multiply(f.minus(g.divide(j))))
Jetzt wer brauchta+b
!first off, ist dies, wie man sich das normalerweise schreiben, dass derselbe Ausdruck mit weniger Klammern Durcheinander:
a + (b - h) * (d / (i + j)) + e + c * (f - g / j)
, und ja, ich sage, das ist so viel einfacher. Zum Beispiel kann ich sehr schnell sehen, dass die Komponenten, werden addiert und multipliziert oder dividiert werden, was. Mit dera.op(b)
schreiben, dass ist ziemlich schwer zu finden. Ich weiß nicht, über Sie, aber ich wuchs mit operator + seit der Grundschule, also natürlich ist es viel übersichtlicher für mich.InformationsquelleAutor James Curran
In diesem Zusammenhang Frage helfen könnte. In kurzen, operator überladen wurde absichtlich vermieden, wenn die Java entworfen wurde, aufgrund von Problemen mit überladung in C++.
Scala, eine neuere JVM-Sprache hat eine syntax, die es erlaubt Methode überladen, die Funktionen sehr ähnlich wie operator-überladung, ohne die Einschränkungen von C++ operator-überladung. In Scala ist es möglich zu definieren, eine Methode mit dem Namen
+
zum Beispiel. Es ist auch möglich, das weglassen der.
Betreiber und Klammern in Methodenaufrufen:InformationsquelleAutor Aaron Novstrup
Keine Sprache muss - operator überladen. Einige glauben, dass Java würde profitieren von hinzufügen, aber deren Unterlassung wurde publik, als ein Vorteil für so lange, dass du es fast schon politisch inakzeptabel (und es ist erst seit dem Oracle-Aufkauf, ich würde sogar das "fast").
Der Gegenpol besteht in der Regel aus, postulieren einige sinnlos (oder gar widersprüchlich) überlast -, wie die addition von zwei Mitarbeitern oder überlastung '+' zu tun. division. While-operator überladen in Sprachen wie C++ würde dies erlauben, fehlende operator-overloading in Java bedeutet wenig, zu verhindern oder sogar verringern das problem.
someEmployee.Add(anotherEmployee)
ist keine Verbesserung gegenübersomeEmployee + anotherEmployee
. Ebenso, wennmyLargeInteger.Add(anotherLargeInteger)
tatsächlich division anstelle der addition. Zumindest für mich, diese Argumentation erscheint nicht überzeugend gründlich, am besten.Es ist jedoch ein weiterer Punkt, in dem das weglassen operator überladen hat (fast sicher) haben einen wirklichen nutzen. Seine Unterlassung hält die Sprache leichter zu verarbeiten, das macht es viel einfacher (und schneller) zu entwickeln, die Werkzeuge, der Prozess der Sprache. Nur für ein offensichtliches Beispiel, refactoring-tools für Java sind viel zahlreicher und umfassender als für C++. Ich bezweifle, dass dies kann oder gutgeschrieben werden soll, speziell und ausschließlich zur Unterstützung der operator overloading in C++ und seine Unterlassung in Java. Dennoch, die Allgemeine Haltung Java einfache (einschließlich der Unterlassung von operator überladen) ist zweifellos ein bedeutender Faktor.
Die Möglichkeit der Vereinfachung der Analyse, indem die Leerzeichen zwischen Bezeichner und Operatoren (z.B.
a+b
verboten, abera + b
erlaubt) angehoben wurde. Zumindest meiner Meinung nach, ist dies unwahrscheinlich, um tatsächlich einen Unterschied in den meisten Fällen. Der Grund ist relativ einfach: mindestens in einem typischen compiler, parser vorangestellt ist ein lexer. Die lexer-Extrakte Token aus dem Eingabe-stream und speist Sie an den parser. Mit einer solchen Struktur, die der parser nicht sehen, überhaupt einen Unterschied zwischen dena+b
unda + b
. So oder so, es würde erhalten genau drei Token:identifer
,+
, undidentifier
.Dass die Räume könnte Vereinfachung der lexer ein klein wenig--aber, soweit es täte, würde es sein, völlig unabhängig von operator überladen, zumindest unter der Annahme der operator überladen wurde, wie es in C++, wo nur die bestehenden Token verwendet1.
So, wenn das ist nicht das problem, was ist? Das problem mit operator-überladung ist, dass Sie nicht hart-code parser, um zu wissen, die Bedeutung eines operators. Mit Java, für einen bestimmten
a = b + c
gibt es genau zwei Möglichkeiten:a
,b
und c sind jeweils ausgewählt aus einer kleinen, begrenzten Gruppe von Arten, und die Bedeutung, die+
gebacken wird, in die Sprache, sonst haben Sie einen Fehler. So, ein tool, das beib + c
und Sinn machen kann sehr minimal analysieren, um sicherzustellen, dassb
undc
sind Typen, die Hinzugefügt werden können. Wenn Sie sind, es weiß, was der Zusatz bedeutet, welche Art von Ergebnis Sie produziert, und so weiter. Wenn Sie nicht, es kann Unterstrichen in Roter kringel (oder was auch immer), um anzuzeigen, ein Fehler.Für C++, die Dinge sind ganz anders. Für einen Ausdruck wie
a = b + c;
,b
undc
könnte fast ganz beliebige Typen. Die+
umgesetzt werden könnte, wie eine member-Funktion vonb
's geben, oder es könnte eine Kostenlose Funktion. In einigen Fällen könnten wir eine Reihe von operator-überladungen (einige von denen werden könnte, Vorlagen), die könnte der Durchführung der operation, so dass wir tun müssen, überlast Auflösung zu bestimmen, welche der compiler tatsächlich wählen Sie basierend auf den Typen der Parameter (und wenn einige von Ihnen sind Vorlagen, die überlast Auflösung Regeln bekommen Sie noch mehr komplexe).Lässt uns bestimmen Sie den Typ des Ergebnisses von
b + c
. Von dort sind wir im Grunde wiederholen Sie den gesamten Prozess erneut, um herauszufinden, was (wenn überhaupt) überladung wird verwendet, um ordnen Sie das Ergebnis aufa
. Es könnte integriert sein, oder es könnte einen anderen operator überladen, und möglicherweise gibt es mehrere mögliche überladungen, die den job tun könnte, so haben wir zu tun überlast Auflösung wieder, um herauszufinden, den richtigen Betreiber zu verwenden hier.Kurz, nur um herauszufinden, was
a = b + c;
bedeutet in C++ erfordert fast einen ganzen compiler-front-end. Wir können das gleiche in Java mit einem viel kleinere Teilmenge von a compiler2Ich bezweifle operator überlädt, ist viel schwieriger zu analysieren ist, wenn Sie erzwingen Leerzeichen(dh nicht erlauben "a+b" nur "a + b")
Rechts können regex verwenden Sie stattdessen
Complex c = expression.parse("1+a*b+new Complex(1,1)")
... oder warten, können erstellen eine parser-ersten. Es kann nicht so schwer sein, oder doch?!der parser (als solche) ist in der Regel nicht "bewusst" Räume (oder deren fehlen). Diejenigen, die gehandhabt werden durch den lexer, ohne "bewusst" - operator überladen überhaupt. Der parser erhält nur Token vom lexer, so dass der vorhergehende stream würde
identifier
,+
,identifier
ob es Leerzeichen enthielt oder nicht.Sorry, aber dein Kommentar macht nicht viel Sinn für mich. Während es sicherlich möglich, etwas zu bauen, wie regexes über operator überladung in C++ (z.B. Boost Xpressive) für die meisten typischen Zwecke, es ist viel mehr üblich, es zu tun (z.B. Boost-regex -
std::regex
usw.) Jeder hat gute und schlechte Punkte, aber Sie funktionieren.InformationsquelleAutor Jerry Coffin
java-oo-compiler-plugin hinzufügen können-Operator Überladen-Unterstützung in Java.
InformationsquelleAutor mart
Java unterstützt kein operator overloading durch Programmierer. Dies ist nicht das gleiche wie die Aussage, dass Java nicht benötigen-operator überladen.
Operator überladen ist syntaktischer Zucker, um express eine operation, durch (arithmetische) Symbole. Aus offensichtlichen Gründen, die Designer der Java-Programmiersprache wählte weglassen Unterstützung für operator-überladung in der Sprache. Diese Erklärung finden Sie in der Java Language Environment-whitepaper:
In meine persönliche Meinung, das ist eine gute Entscheidung. Betrachten Sie die folgende Stück code:
Nun, es ist ziemlich offensichtlich, dass
b
undc
verkettet werden, um die Ausbeutea
. Aber wenn man bedenkt das folgende snippet geschrieben mit einer hypothetischen Sprache, die unterstützt operator überladen wird, ist es ziemlich offensichtlich, dass die Verwendung von operator-überladung nicht für lesbaren code.Um zu verstehen, das Ergebnis der obigen operation, muss man Sicht die Umsetzung der überladenen Additions-operator für die Klasse "Person". Sicher, das macht für eine langwierige debugging-session, und der code ist besser umgesetzt als:
Ich denke, das wäre eine etwas ausführliche aber verständliche Sprache mit Rahmen Begehen weniger Fehler. Ich bevorzuge Sprachen, die mir nicht erlauben, dies zu tun - #define private public (oder Varianten davon).
Ich habe es immer gehasst, die Logik, "weil schlechte Programmierer können diese Funktionalität verwenden, schlechten code zu schreiben, der diese Funktionalität ist schlecht". Es gibt viele Fälle, in denen die Betreiber in der code wäre viel übersichtlicher als die Methode Namen. Zu wissen, Wann operator überladen, und wenn nicht, ist nur ein Zeichen für eine bessere Programmierer. Sie könnten genauso gut sagen "zu können, haben zwei Methoden mit dem gleichen Namen ist schlecht, weil jemand alle Namen und alle Ihre Methoden den gleichen Namen, auch wenn Sie etwas anders machen".
Während ich nicht einverstanden mit Vineet (ich bevorzuge eine Sprache, die es ermöglicht, die guten Programmierer, um express seine Absicht effizient ein, damit werden die schlechten Programmierer), ich glaube nicht, dass diese Antwort verdient einen downvote. Ob wir einverstanden sind mit der Java-Designer oder nicht, das argument ist einer der Gründe, die Java unterstützt kein operator overloading.
Schlechte Programmierer schreiben schlechte code in einer beliebigen Sprache. Sicher, einige Sprach-features machen es einfacher oder schwieriger, aber die gleichen Funktionen der Sprache haben kann, die genau entgegengesetzten Effekt für gute Programmierer (making-code übersichtlicher verwendet, die ein guter Programmierer vs hässlicher verwendet, die von einem schlechten Programmierer). Gerade weil die Menschen Verletzte bei Verkehrsunfällen bedeutet nicht, sollten wir alle Pferde Reiten.
InformationsquelleAutor Vineet Reynolds
Es ist nicht so, dass java nicht "müssen" - operator überladen, es ist nur eine Wahl, die von seinem Schöpfer, wer wollte, um die Sprache einfacher.
In fairness, es ist verschiedenen Personen zu völlig verschiedenen Zeiten.
Nicht, dass die Generika tatsächlich Wert waren, alles in Java.
InformationsquelleAutor Colin Hebert
OK Gut... wir haben eine sehr diskutierte und häufiges Problem. Heute, in der software-Industrie, gibt es hauptsächlich zwei verschiedene Arten von Sprachen:
Diese Unterscheidung war sinnvoll, über 10 Jahre nun vor, die situation in der Gegenwart ist, ist ein wenig anders.
Heute sprechen wir über das business-ready-Anwendungen.
Geschäftsmodelle sind einige Besondere Modelle, in denen die Programme müssen viele Anforderungen erfüllen. Sie sind so Komplex und so streng sein, dass die Codierung eine Anwendung mit einer Sprache wie c oder c++ wäre sehr Zeit-Ausgaben. Aus diesem Grund hybrid-Sprachen, wo erfunden.
Wir gemeinhin wissen, zwei Arten von Sprachen:
Gut, heute ist es ein anderes:
Verwalteten Sprachen sind Sprachen, die kompiliert werden, um zu einem anderen code, unterscheidet sich vom original, aber wesentlich komplexer zu handhaben. Diese Zwischensprache wird dann INTERPETED durch ein Programm läuft, dass das fertige Programm.
Ist es die gemeinsame Dynamik kamen wir wissen, von Java... Es ist eine gewinnende Ansatz für business-Anwendungen bereit.
Gut, nun zu deiner Frage...
Operator überlädt, ist eine Frage, die betrifft auch die mehrfache Vererbung und andere erweiterte Merkmale von low-level-Sprachen.
Java, sowie C#, Python und so weiter, ist eine verwaltete Sprache, als einfach zu schreiben und nützlich für den Aufbau von komplexen Anwendungen in sehr wenig Zeit.
Wenn wir operator-overloading in Java, die Sprache komplexer geworden und schwieriger zu handhaben.
Wenn Sie das Programm in C++ können Sie sicher verstehen, dass operator-überladung ist ein sehr, sehr, sehr heikle Angelegenheit, da kann es zu sehr komplexen Situationen und manchmal compiler weigern könnten zu kompilieren, weil es Konflikte und so weiter... die Einführung von operator überladen werden sorgfältig durchgeführt. ES IST MÄCHTIG, aber wir bezahlen diese Leistung mit einer unglaublich großen Menge von Problemen zu behandeln.
OKOK, ES IST WAHR, Sie könnten mir sagen: "HEY, Aber C# verwendet operator überladen... Was zur Hölle erzählst du mir das? warum c# unterstützt und Java nicht?".
Gut, das ist die Antwort. C#, ja, implementiert operator überladen, aber es ist nicht wie C++. Es gibt viele Betreiber, die können nicht überladen werden in c# wie "neu" oder viele andere, können Sie die überladung in c++... So unterstützt C# - operator überladen, aber in einem sehr viel niedrigeren Niveau als c++ oder andere Sprachen werden vollständig unterstützt. Aber dies ist nicht eine gute Antwort auf die Vorherige Frage...
Die richtige Antwort ist, dass C# ist komplexer als Java. Dies ist ein pro, aber auch Kontra. Es ist eine Frage der Entscheidung, wo die Sprache: hohes Niveau, höheres Niveau, sehr hohem Niveau?
Gut, Java nicht unterstützt, op überladen will, weil es schnell und einfach zu verwalten und zu verwenden. Bei der Einführung von op-überladung ist, eine Sprache, müssen auch tragen eine große Menge von Problemen, die durch diese neue Funktionalität.
Es ist genau so Fragen: "Warum hat Java keine Mehrfachvererbung?"
Denn es ist Ungeheuer Komplex zu verwalten. Denke, es... ES WÄRE UNMÖGLICH für eine verwaltete Sprache Mehrfachvererbung... Keine gemeinsame Klasse Baum, keine Klasse object als gemeinsame Basisklasse für alle Klassen, keine Möglichkeit, upcasting (sicher) und viele Probleme zu behandeln, verwalten, sehen, denken zählen...
Java will einfach sein.
Auch wenn ich glaube, dass zukünftige Implementierungen dieser Sprache wird das Ergebnis bei der Unterstützung op überladen, Sie werden sehen, dass die überlastung Dynamik beinhalten eine weniger alle Möglichkeiten, die Sie haben über das überladen in C++.
Viele andere hier, auch erzählte Sie, dass eine überlastung ist nutzlos.
Auch ich gehöre zu denen, die denken, das ist nicht wahr.
Nun, wenn Sie denken, diese Art (op-überladung ist nutzlos), dann auch viele andere Aspekte der managed-Sprachen sind nutzlos. Denke, über interfaces, Klassen und so weiter, die Sie wirklich nicht brauchen. Sie können abstrakte Klassen interface-Implementierungen... schauen wir uns c#... so viele Zucker-syntax, LINQ und so weiter, Sie sind nicht wirklich notwendig, ABER SIE nehmen IHRE ARBEIT...
Gut, in verwalteten Sprachen, alles, was befestigen eines Entwicklungsprozesses ist willkommen und impliziert nicht Nutzlosigkeit. Wenn Sie denken, dass diese Funktionen sind nicht nützlich, als die gesamte Sprache selbst würde nutzlos sein, und wir alle kommen zurück, die Programmierung von komplexen Anwendungen in c++, ada, etc. Der Mehrwert von managed Sprachen ist, um gemessen zu werden Recht auf diese Elemente.
Op-überladung ist ein sehr nützliches feature, das es sein könnte implementiert in Sprachen wie Java, und dies würde sich ändern, die Sprache, die Struktur und Zweck, es wäre eine gute Sache, aber eine schlechte Sache ist auch nur eine Frage von Geschmack.
Aber heute, Java ist einfacher als C# auch aus diesem Grund, weil Java nicht unterstützt op-zu überladen.
Ich weiß, vielleicht war ich ein wenig lang, aber hoffe es hilft. Bye
InformationsquelleAutor
Java nicht unterstützt-operator überladen (eine Referenz der Wikipedia-Operator Überladen Seite). Dies war eine design-Entscheidung von Java-Schöpfer zu vermeiden, wahrgenommen, gesehen Probleme mit operator-überladung in anderen Sprachen (insbesondere C++).
InformationsquelleAutor GreenMatt
Überprüfen Java-Funktionen Entfernt, die von C und C++ p 2.2.7 Nicht Mehr-Operator Überladen.
InformationsquelleAutor Incognito