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 .
BigInteger
in Java verwendet wird, und schauen Sie sich dann ähnlichen Code an, der BigInteger
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 ein Matrix
und v0
, v1
, v2
, v3
, und v4
wie Vector
s, einfach vergleichen , wie lange es dauert , um richtig den folgenden mathematischen Ausdruck zu interpretieren m0.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önnen m0.transpose() * (v0 + v1 * v2).cross(v3) - v4;
.
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.
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)
statt a + b
. Eine Zusammenfassung der anderen Java-Bits, die in C-ähnlichen Sprachen ausgelassen wurden, finden Sie hier: Aus C und C ++ entfernte Funktionen
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.
&
, |
und ^
sind für Überlastung boolean
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.
a := "hello"; b := "world"; c := (a + b = b + a);
oder in Java:
String a = "hello"; String b = "world"; boolean c = (a + b).equals(b + a);
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.
==
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.
Verwenden Sie einfach Xtend zusammen mit Ihrem Java-Code. Es unterstützt das Überladen von Operatoren:
package com.example;
@SuppressWarnings("all")
public class Test {
protected int wrapped;
public Test(final int value) {
this.wrapped = value;
}
public int operator_plus(final Test e2) {
return (this.wrapped + e2.wrapped);
}
}
package com.example
class Test2 {
new() {
val t1 = new Test(3)
val t2 = new Test(5)
val t3 = t1 + t2
}
}
Auf der offiziellen Website finden Sie eine Liste der zu implementierenden Methoden für jeden Bediener!
Oder Sie können Java Groovy erstellen und diese Funktionen einfach überladen, um das zu erreichen, was Sie möchten
//plus() => for the + operator
//multiply() => for the * operator
//leftShift() = for the << operator
// ... and so on ...
class Fish {
def leftShift(Fish fish) {
print "You just << (left shifted) some fish "
}
}
def fish = new Fish()
def fish2 = new Fish()
fish << fish2
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.
Im Gegensatz zu C ++ unterstützt Java keine benutzerdefinierte Operatorüberladung. Das Überladen erfolgt intern in Java.
Wir können +
zum Beispiel (plus) nehmen :
int a = 2 + 4;
string = "hello" + "world";
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.