Подскажите пожалуйста, возможно ли перегрузить операторы в Java? Если это используется где-нибудь в Java, не могли бы вы рассказать мне об этом.
java
operator-overloading
Vipul
источник
источник
Ответы:
Нет, Java не поддерживает пользовательскую перегрузку операторов. Единственный аспект Java, который приближается к «пользовательской» перегрузке операторов, - это обработка + для строк, которая приводит либо к конкатенации констант во время компиляции, либо к конкатенации во время выполнения с использованием StringBuilder / StringBuffer. Вы не можете определить свои собственные операторы, которые действуют таким же образом, хотя.
Для Java-подобных (и JVM основе) языка , который делает перегружать поддержки оператора, вы можете посмотреть на Котлин или Groovy . В качестве альтернативы, вам может повезти с плагином Java .
источник
BigInteger
в Java, затем посмотрите на подобный код, используяBigInteger
в C # операторы. Я не понимаю, как делегаты нарушают принципы ООП - вы должны быть более точными в своих возражениях. Я не знаю деталей того, почему Java-дизайнеры не включили различные функции, но я подозреваю, что есть смесь давления ресурсов и желания сделать язык маленьким и относительно простым.m0
какMatrix
иv0
,v1
,v2
,v3
, и ,v4
какVector
с, просто сравнить , сколько времени требуется , чтобы вы правильно интерпретировать следующее математическое выражениеm0.transpose().mult(v0.add(v1.mult(v2)).cross(v3)).sub(v4);
. Если бы была включена поддержка перегрузки операторов, она могла бы быть записана какm0.transpose() * (v0 + v1 * v2).cross(v3) - v4;
.Перегрузка оператора используется в Java для конкатенации типа String:
Однако вы не можете определить собственные перегрузки операторов.
источник
В дополнение ко всем людям, указавшим, что
+
перегружено для строк,-
также перегружено как для операций с плавающей запятой, так и для целочисленных операций, как есть*
и/
.[edit]
%
также перегружен для чисел с плавающей запятой, что может быть сюрпризом для тех, кто имеет C или C ++ фон.источник
Java не допускает перегрузки операторов. Предпочтительным подходом является определение метода в вашем классе для выполнения действия:
a.add(b)
вместоa + b
. Вы можете увидеть краткую информацию о других битах, которые Java не учитывает в C-подобных языках, здесь: Функции, удаленные из C и C ++источник
Вы не можете сделать это самостоятельно, поскольку Java не допускает перегрузки операторов.
Однако за одним исключением. + и + = перегружены для объектов String.
источник
&
,|
и^
перегружены дляboolean
целочисленных типов. И действительно, арифметические и реляционные операторы перегружены для различных числовых типов. (Конечно, семантика перегрузок намного ближе ...)Как и многие другие ответили: Java не поддерживает пользовательскую перегрузку операторов.
Может быть, это не по теме, но я хочу прокомментировать некоторые вещи, которые я прочитал в некоторых ответах.
О читабельности.
Для сравнения:
Посмотри снова!
Какой из них более читабелен?
Язык программирования, который позволяет создавать пользовательские типы, должен позволять им действовать так же, как встроенные типы (или примитивные типы).
Таким образом, Java нарушает фундаментальный принцип общего программирования:
мы должны иметь возможность обмениваться объектами встроенных типов с объектами пользовательских типов.
(Вам может быть интересно: «Он сказал« объекты встроенного »?». Да, смотрите здесь .)
О конкатенации строк:
Математики используют символ + для коммутативных операций над множествами.
Таким образом, мы можем быть уверены, что a + b = b + a.
Конкатенация строк (в большинстве языков программирования) не соответствует этой обычной математической записи.
или в Java:
Дополнительно:
обратите внимание, как в Java смешиваются равенство и идентичность. Символ == (равенство) означает:
a. Равенство для примитивных типов.
б. Проверка идентичности для пользовательских типов, поэтому мы вынуждены использовать функцию equals () для равенства.
Но ... Какое это имеет отношение к перегрузке операторов?
Если язык допускает перегрузку оператора, пользователь может придать правильное значение оператору равенства.
источник
==
используется для равенства в Java, как в C и C ++. Это не имеет ничего общего с перегрузкой операторов.Можно попробовать перегрузку оператора Java . У него есть свои ограничения, но стоит попробовать, если вы действительно хотите использовать перегрузку операторов.
источник
Просто используйте Xtend вместе с вашим Java-кодом. Поддерживает перегрузку операторов:
На официальном сайте есть список способов реализации для каждого оператора!
источник
Или вы можете сделать Java Groovy и просто перегружать эти функции для достижения того, что вы хотите
Кто не хочет быть / использовать заводной? : D
Нет, вы не можете использовать скомпилированные Groovy JAR в Java таким же образом. Это все еще ошибка компилятора для Java.
источник
В отличие от C ++, Java не поддерживает пользовательскую перегрузку операторов. Перегрузка выполняется внутри Java.
Мы можем взять
+
(плюс) например:Здесь, плюс добавляет два целых числа и объединяет две строки. Таким образом, мы можем сказать, что Java поддерживает внутреннюю перегрузку операторов, но не определяется пользователем.
источник