Odpowiedzi:
Nie, Java nie obsługuje przeciążania operatora zdefiniowanego przez użytkownika. Jedynym aspektem Java, który zbliża się do „niestandardowego” przeciążenia operatora, jest obsługa + dla łańcuchów, co powoduje albo konkatenację stałych w czasie kompilacji, albo konkatenację w czasie wykonywania przy użyciu StringBuilder / StringBuffer. Nie można jednak zdefiniować własnych operatorów, którzy działają w ten sam sposób.
Dla Java-like (JVM i oparte na języku), który robi przeciążanie operatorów wsparcie, można spojrzeć na Kotlin lub Groovy . Alternatywnie możesz znaleźć szczęście dzięki rozwiązaniu wtyczki kompilatora Java .
BigInteger
w Javie, a następnie spójrz na podobny kod przy BigInteger
użyciu operatorów C #. Nie rozumiem, jak delegaci łamią zasady OOP - musisz być znacznie bardziej precyzyjny w swoich sprzeciwach. Nie znam szczegółów, dlaczego projektanci Java nie uwzględnili różnych funkcji, ale podejrzewam, że istnieje mieszanka presji zasobów i chęci, aby język był mały i stosunkowo prosty.
m0
jak Matrix
i v0
, v1
, v2
, v3
, i v4
jako Vector
s, wystarczy porównać jak długo to trwa, aby poprawnie zinterpretować następujące wyrażenie matematyczne m0.transpose().mult(v0.add(v1.mult(v2)).cross(v3)).sub(v4);
. Gdyby uwzględniono obsługę przeciążania operatora, można by ją zapisać jako m0.transpose() * (v0 + v1 * v2).cross(v3) - v4;
.
Oprócz wszystkich osób wskazujących, że +
jest przeciążony dla ciągów, -
jest również przeciążony zarówno dla operacji zmiennoprzecinkowych, jak i liczb całkowitych, tak jak *
i /
.
[edit]
%
jest również przeciążony zmiennoprzecinkowym, co może być nieco zaskoczeniem dla osób z tłem C lub C ++.
Java nie pozwala na przeciążanie operatora. Preferowanym podejściem jest zdefiniowanie metody w klasie do wykonania akcji: a.add(b)
zamiast a + b
. Możesz zobaczyć podsumowanie innych bitów Java pominiętych z języków podobnych do C: Funkcje usunięte z C i C ++
Nie możesz tego zrobić sam, ponieważ Java nie pozwala na przeciążanie operatora.
Jednak z jednym wyjątkiem. + i + = są przeciążone dla obiektów String.
&
, |
i ^
są przeciążeniem dla boolean
typów integralnych. I rzeczywiście, operatory arytmetyczne i relacyjne są przeciążone dla różnych typów liczbowych. (Oczywiście semantyka przeciążeń jest znacznie bliższa ...)
Jak wielu innych odpowiedziało: Java nie obsługuje przeciążania operatora zdefiniowanego przez użytkownika.
Może to nie na temat, ale chcę skomentować niektóre rzeczy, które czytam w niektórych odpowiedziach.
O czytelności.
Porównać:
Spójrz ponownie!
Który jest bardziej czytelny?
Język programowania, który umożliwia tworzenie typów zdefiniowanych przez użytkownika, powinien umożliwiać im działanie w taki sam sposób, jak typy wbudowane (lub typy pierwotne).
Zatem Java łamie podstawową zasadę programowania ogólnego:
powinniśmy być w stanie wymieniać obiekty typów wbudowanych z obiektami typów zdefiniowanych przez użytkownika.
(Być może zastanawiasz się: „Czy powiedział„ obiekty wbudowane ”?”. Tak, zobacz tutaj .)
O łączeniu ciągów:
Matematycy używają symbolu + do operacji przemiennych na zbiorach.
Możemy więc być pewni, że a + b = b + a.
Łączenie łańcuchów (w większości języków programowania) nie respektuje tego wspólnego zapisu matematycznego.
a := "hello"; b := "world"; c := (a + b = b + a);
lub w Javie:
String a = "hello"; String b = "world"; boolean c = (a + b).equals(b + a);
Dodatkowo:
Zauważ, że w Javie równość i tożsamość są mylone. W == (równość) symbol oznacza:
a. Równość dla typów pierwotnych.
b. Sprawdzanie tożsamości dla typów zdefiniowanych przez użytkownika, dlatego jesteśmy zmuszeni używać funkcji equals () do równości.
Ale ... Co to ma wspólnego z przeciążeniem operatora?
Jeśli język pozwala przeciążeniu operatora, użytkownik może nadać operatorowi równości odpowiednie znaczenie.
==
służy do równości w Javie, podobnie jak w C i C ++. Nie ma to nic wspólnego z przeciążeniem operatora.
Można spróbować przeciążenia operatora Java . Ma swoje ograniczenia, ale warto spróbować, jeśli naprawdę chcesz użyć przeciążenia operatora.
Wystarczy użyć Xtend wraz z kodem Java. Obsługuje przeciążenie operatora:
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
}
}
Na oficjalnej stronie znajduje się lista metod do wdrożenia dla każdego operatora!
Lub możesz zrobić Java Groovy i po prostu przeciążać te funkcje, aby osiągnąć to, czego chcesz
//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
Kto nie chce być / używać groovy? :RE
Nie, nie możesz używać skompilowanych świetnych plików JAR w Javie w ten sam sposób. Nadal jest to błąd kompilatora Java.
W przeciwieństwie do C ++, Java nie obsługuje przeciążania operatora zdefiniowanego przez użytkownika. Przeciążenie odbywa się wewnętrznie w java.
Możemy wziąć +
(plus) na przykład:
int a = 2 + 4;
string = "hello" + "world";
Tutaj plus dodaje dwie liczby całkowite i łączy dwa ciągi. Możemy więc powiedzieć, że Java obsługuje przeciążanie operatora wewnętrznego, ale nie jest zdefiniowane przez użytkownika.