Können Sie mir bitte sagen, ob es möglich ist, Operatoren in Java zu überladen? Wenn es irgendwo in Java verwendet wird, können Sie mir bitte davon erzählen.
java
operator-overloading
Vipul
quelle
quelle
Antworten:
Nein, Java unterstützt keine benutzerdefinierte Operatorüberladung. Der einzige Aspekt von Java, der der "benutzerdefinierten" Operatorüberladung nahe kommt, ist die Behandlung von + für Zeichenfolgen, die entweder zur Verkettung von Konstanten zur Kompilierungszeit oder zur Verkettung zur Ausführungszeit mit StringBuilder / StringBuffer führt. Sie können jedoch keine eigenen Operatoren definieren, die auf die gleiche Weise handeln.
Für eine Java-ähnliche (und JVM-basierte) Sprache, die das Überladen von Operatoren unterstützt, können Sie sich Kotlin oder Groovy ansehen . Alternativ könnten Sie Glück mit einer Java-Compiler-Plugin-Lösung finden .
quelle
BigInteger
in Java verwendet wird, und schauen Sie sich dann ähnlichen Code an, derBigInteger
in C # mit Operatoren verwendet wird. Ich sehe nicht, wie Delegierte gegen OOP-Prinzipien verstoßen - Sie müssen in Ihren Einwänden viel präziser sein. Ich weiß nicht genau, warum die Java-Designer nicht verschiedene Funktionen integriert haben, aber ich vermute, dass es eine Mischung aus Ressourcendruck und dem Wunsch gibt, die Sprache klein und relativ einfach zu halten.m0
als einMatrix
undv0
,v1
,v2
,v3
, undv4
wieVector
s, einfach vergleichen , wie lange es dauert , um richtig den folgenden mathematischen Ausdruck zu interpretierenm0.transpose().mult(v0.add(v1.mult(v2)).cross(v3)).sub(v4);
. Wäre die Unterstützung für das Überladen von Bedienern enthalten gewesen, hätte dies als geschrieben werden könnenm0.transpose() * (v0 + v1 * v2).cross(v3) - v4;
.Das Überladen von Operatoren wird in Java für die Verkettung des String-Typs verwendet:
Sie können jedoch keine eigenen Operatorüberladungen definieren.
quelle
Zusätzlich zu allen Personen, die darauf hinweisen, dass
+
für Strings überladen ist,-
ist auch für Gleitkomma- und Ganzzahloperationen überladen, wie*
und/
.[edit]
%
ist auch für Gleitkommawerte überladen, was für Benutzer mit C- oder C ++ - Hintergrund eine kleine Überraschung sein kann.quelle
Java erlaubt keine Überladung von Operatoren. Der bevorzugte Ansatz besteht darin, eine Methode für Ihre Klasse zu definieren, um die Aktion auszuführen:
a.add(b)
statta + b
. Eine Zusammenfassung der anderen Java-Bits, die in C-ähnlichen Sprachen ausgelassen wurden, finden Sie hier: Aus C und C ++ entfernte Funktionenquelle
Sie können dies nicht selbst tun, da Java keine Überladung von Operatoren zulässt.
Mit einer Ausnahme jedoch. + und + = sind für String-Objekte überladen.
quelle
&
,|
und^
sind für Überlastungboolean
und Integral - Typen. Tatsächlich sind die arithmetischen und relationalen Operatoren für verschiedene numerische Typen überladen. (Natürlich ist die Semantik der Überladungen viel näher ...)Wie viele andere geantwortet haben: Java unterstützt keine benutzerdefinierte Operatorüberladung.
Vielleicht ist dies kein Thema, aber ich möchte einige Dinge kommentieren, die ich in einigen Antworten gelesen habe.
Über Lesbarkeit.
Vergleichen Sie:
Schau nochmal!
Welches ist besser lesbar?
Eine Programmiersprache, mit der benutzerdefinierte Typen erstellt werden können, sollte es ihnen ermöglichen, auf die gleiche Weise wie die integrierten Typen (oder primitiven Typen) zu handeln.
Java bricht also ein Grundprinzip der generischen Programmierung:
Wir sollten in der Lage sein, Objekte von eingebauten Typen mit Objekten von benutzerdefinierten Typen auszutauschen.
(Sie fragen sich vielleicht: "Hat er 'eingebaute Objekte' gesagt?". Ja, siehe hier .)
Informationen zur Verkettung von Zeichenfolgen:
Mathematiker verwenden das Symbol + für kommutative Operationen an Mengen.
Wir können also sicher sein, dass a + b = b + a.
Die Verkettung von Zeichenfolgen (in den meisten Programmiersprachen) berücksichtigt diese allgemeine mathematische Notation nicht.
oder in Java:
Extra:
Beachten Sie, wie in Java Gleichheit und Identität verwechselt werden. Das Symbol == (Gleichheit) bedeutet:
a. Gleichheit für primitive Typen.
b. Identitätsprüfung für benutzerdefinierte Typen, daher sind wir gezwungen, die Funktion equals () für die Gleichheit zu verwenden.
Aber ... Was hat das mit Überlastung des Bedieners zu tun?
Wenn die Sprache eine Überlastung des Operators zulässt, kann der Benutzer dem Gleichheitsoperator die richtige Bedeutung geben.
quelle
==
wird in Java wie in C und C ++ für die Gleichheit verwendet. Dies hat nichts mit einer Überlastung des Bedieners zu tun.Man kann Java Operator Overloading ausprobieren . Es hat seine eigenen Einschränkungen, aber es lohnt sich zu versuchen, wenn Sie wirklich die Operatorüberladung verwenden möchten.
quelle
Verwenden Sie einfach Xtend zusammen mit Ihrem Java-Code. Es unterstützt das Überladen von Operatoren:
Auf der offiziellen Website finden Sie eine Liste der zu implementierenden Methoden für jeden Bediener!
quelle
Oder Sie können Java Groovy erstellen und diese Funktionen einfach überladen, um das zu erreichen, was Sie möchten
Wer will nicht groovig sein / benutzen? : D.
Nein, Sie können die kompilierten groovigen JARs in Java nicht auf die gleiche Weise verwenden. Es ist immer noch ein Compilerfehler für Java.
quelle
Im Gegensatz zu C ++ unterstützt Java keine benutzerdefinierte Operatorüberladung. Das Überladen erfolgt intern in Java.
Wir können
+
zum Beispiel (plus) nehmen :Hier fügt plus zwei Ganzzahlen hinzu und verkettet zwei Zeichenfolgen. Wir können also sagen, dass Java das Überladen interner Operatoren unterstützt, jedoch nicht benutzerdefiniert.
quelle