Czy możesz mi powiedzieć, czy możliwe jest przeciążenie operatorów w Javie? Jeśli jest używany gdziekolwiek w Javie, proszę o informację.
java
operator-overloading
Vipul
źródło
źródło
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 .
źródło
BigInteger
w Javie, a następnie spójrz na podobny kod przyBigInteger
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
jakMatrix
iv0
,v1
,v2
,v3
, iv4
jakoVector
s, wystarczy porównać jak długo to trwa, aby poprawnie zinterpretować następujące wyrażenie matematycznem0.transpose().mult(v0.add(v1.mult(v2)).cross(v3)).sub(v4);
. Gdyby uwzględniono obsługę przeciążania operatora, można by ją zapisać jakom0.transpose() * (v0 + v1 * v2).cross(v3) - v4;
.Przeciążenie operatora jest używane w Javie do konkatenacji typu String:
Nie można jednak zdefiniować przeciążeń własnego operatora.
źródło
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 ++.źródło
Java nie pozwala na przeciążanie operatora. Preferowanym podejściem jest zdefiniowanie metody w klasie do wykonania akcji:
a.add(b)
zamiasta + 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 ++źródło
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.
źródło
&
,|
i^
są przeciążeniem dlaboolean
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.
lub w Javie:
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.
źródło
==
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.
źródło
Wystarczy użyć Xtend wraz z kodem Java. Obsługuje przeciążenie operatora:
Na oficjalnej stronie znajduje się lista metod do wdrożenia dla każdego operatora!
źródło
Lub możesz zrobić Java Groovy i po prostu przeciążać te funkcje, aby osiągnąć to, czego chcesz
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.
źródło
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: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.
źródło