Bitte können Sie mir sagen, ob es möglich ist, Betreiber in Java zu überlasten? Wenn es irgendwo in Java verwendet wird, könntest du mir bitte davon erzählen.Operator Überladung in Java
Antwort
Nein, Java unterstützt kein benutzerdefiniertes Überladen von Operatoren. Der einzige Aspekt von Java, der einem "benutzerdefinierten" Überladen von Operatoren nahe kommt, ist die Behandlung von + für Strings, die entweder eine Verkettung von Konstanten zur Kompilierungszeit oder eine Verkettung von Ausführungszeiten mit StringBuilder/StringBuffer zur Folge hat. Sie können jedoch keine eigenen Operatoren definieren, die sich gleich verhalten.
Für eine Java-ähnliche (und JVM-basierte) Sprache, die unterstützt Unterstützung überladen, können Sie Groovy betrachten. Alternativ können Sie Glück mit einem Java compiler plugin solution finden.
Sie sagen, dass wir Wrapper nicht erstellen können in Java? Wie SmallInteger wie Integer? –
@ tuğrulbüyükışık: Es gibt bereits Wrapper für alle vorhandenen primitiven Typen. Wenn Sie jedoch einen eigenen neuen Wrapper-Typ erstellen möchten, können Sie ihn nicht wie die anderen verwenden, da er spezifische Unterstützung in der Sprache hat . –
danke, ich googelte darüber und konnte nicht finden. Ich wollte wissen, ob ich eine komplexe Variable aus zwei Primitiven machen könnte (eine Doppel und eine Int ---> gute Präzision + gute Reichweite) –
Sie können dies nicht selbst tun, da Java keine Überlastung des Operators zulässt.
Mit eine Ausnahme, jedoch. + und + = sind für String-Objekte überladen.
Downvoted warum? –
Es gibt viele andere Beispiele für das Überladen von Operatoren in Java. Zum Beispiel sind '&', '|' und '^' eine Überladung für 'boolesche' und ganzzahlige Typen. Und tatsächlich sind die arithmetischen und relationalen Operatoren für verschiedene numerische Typen überladen. (Natürlich ist die Semantik der Überladungen viel näher ...) –
Überladen von Operatoren ist in Java für die Verkettung der String-Typ verwendet:
String concat = "one" + "two";
aber Sie können Ihre eigenen Betreiber Überlastungen nicht definieren.
Java erlaubt keine Überlastung des Operators. Der bevorzugte Ansatz besteht darin, eine Methode für die Klasse zu definieren, die die Aktion ausführt: a.add(b)
anstelle von a + b
. Sie können eine Zusammenfassung der anderen Bits siehe Java von C aus wie Sprachen hier links: Features Removed from C and C++ Volk
Interessanter Link – Wernsey
Wichtig ist das Designziel, Java-Quelldateien kontextunabhängig zu machen. Der Versuch, sehr große (MLOC) Makro schwere C-Programme zu lesen, hat eine sehr lange Lernkurve. Ein vergleichbares (oder größeres) Java-Programm ist nicht schwieriger als ein kleines Java-Programm. Wie Gosling sagte: Eine Sprache, in der Programmierer arbeiten können. [Und jeder, der denkt, dass die Standard-Ausführlichkeit schädlich ist, sollte in Expertenwissen über Chunking lesen.] –
Dank oracle funktioniert keiner der java.sun.com-Links. Können Sie bitte den aktualisierten Link geben, wenn möglich? –
Zusätzlich zu allen darauf hin, dass +
für Streicher überlastet ist, -
ist auch für beide Gleitkomma und Integer-Operationen überlastet, wie sind *
und /
.
[Bearbeiten] %
ist auch für Fließkommazahl überlastet, was ein wenig eine Überraschung für diejenigen mit einem C oder C++ Hintergrund sein kann.
Man kann versuchen Java Operator Overloading. Es hat seine eigenen Einschränkungen, aber es lohnt sich, es zu versuchen, wenn Sie wirklich Operator Overloading verwenden möchten.
Oder [Licht/JOps] (https://github.com/light/JOps) –
Verwenden Sie einfach Xtend zusammen mit Ihrem Java-Code. Es unterstützt Ü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 gibt es eine Liste der Methoden ist für jeden Betreiber zu implementieren!
Oder Sie können Java Groovy machen und diese Funktionen überladen, nur um zu erreichen, was Sie wollen
//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 groovy sein wollen/verwenden tut? : D
Nein, Sie können die kompilierten groovy JARs in Java nicht auf die gleiche Weise verwenden. Es ist immer noch ein Compilerfehler für Java.
Wie viele andere bereits geantwortet haben: Java unterstützt kein benutzerdefiniertes Überladen von Operatoren.
Vielleicht ist das Off-Thema, aber ich möchte einige Dinge, die ich in einigen Antworten gelesen habe, kommentieren.
Über Lesbarkeit.
vergleichen:
- c = a + b
- c = a.add (b)
Schauen Sie noch einmal!
Welches ist besser lesbar?
Eine Programmiersprache, die die Erstellung benutzerdefinierter Typen ermöglicht, sollte es ihnen ermöglichen, auf die gleiche Weise wie die integrierten Typen (oder primitiven Typen) zu arbeiten.
So Java bricht ein grundlegendes Prinzip der Allgemein Programmierung:
Wir sollten Objekte der Lage sein, mit Objekten von benutzerdefinierten Typen eingebauten Typen auszutauschen.
(Sie wundern sich vielleicht: "Hat er 'Objekte von eingebauten' sagen?" Ja, see here..)
Über Verkettung String:
Mathematicians verwenden, um die symnol + für kommutative Operationen auf Sets.
So können wir sicher sein, dass a + b = b + a.
String-Verkettung (in den meisten Programmiersprachen) respektiert 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 der Überlastung des Bedieners zu tun?
Wenn die Sprache die Überlastung des Operators zulässt, könnte der Benutzer dem Gleichheitsoperator die richtige Bedeutung geben.
Das Symbol '==' wird für die Gleichheit in Java, wie in C und C++ verwendet. Dies hat nichts mit einer Überlastung des Operators zu tun. –
Der Operator == bedeutet in Java nur Gleichheit für primitive Typen. Für benutzerdefinierte Typen bedeutet Identität. In C++ wird die Semantik vom Benutzer definiert, sollte aber die integrierte Semantik, die Gleichheit, beibehalten. String a = "Hallo"; String b = "Hallo"; Boolescher c = (a == b); –
Ja, genau wie in C, welches Java kopiert hat. Sie handeln von Java im Allgemeinen und haben nichts mit der Tatsache zu tun, dass Java das Überladen von Operatoren nicht unterstützt. Wenn Sie Ihre eigene Sprache erstellen, können Sie sie wie gewünscht definieren. –
Mögliche Duplikate von [Warum bietet Java keine Überlastung des Operators?] (Https://stackoverflow.com/questions/77718/why-doesnt-java-offer-operator-overloading) –