Перегрузка операторов в Java
Пожалуйста, скажите, можно ли перегрузить операторов на Java? Если он используется где-нибудь в Java, вы могли бы рассказать мне об этом.
Ответы
Ответ 1
Нет, Java не поддерживает пользовательскую перегрузку оператора. Единственный аспект Java, который близок к "пользовательской" перегрузке оператора, - это обработка + для строк, что либо приводит к конкатенации констант, либо времени выполнения, используя StringBuilder/StringBuffer. Вы не можете определить своих собственных операторов, которые действуют одинаково.
Для Java-подобного (и на основе JVM) языка, который поддерживает перегрузку оператора, вы можете посмотреть Groovy. Кроме того, вы можете найти удачу с плагином для компилятора Java.
Ответ 2
Перегрузка операторов используется в Java для конкатенации типа String:
String concat = "one" + "two";
Однако вы не можете определить собственные перегрузки оператора.
Ответ 3
В дополнение ко всем людям, указывающим, что +
перегружен для строк, -
также перегружен для операций с плавающей запятой и целыми числами, как и *
и /
.
[править]
%
также перегружен для плавающей запятой, что может быть неожиданностью для тех, у кого есть фон C или С++.
Ответ 4
Java не разрешает перегрузку оператора. Предпочтительным подходом является определение метода для вашего класса для выполнения действия: a.add(b)
вместо a + b
. Вы можете увидеть сводку остальных бит Java, оставшихся без использования C-подобных языков здесь: Функции Удалены из C и С++
Ответ 5
Вы не можете сделать это самостоятельно, так как Java не разрешает перегрузку оператора.
За одним исключением. + и + = перегружены для объектов String.
Ответ 6
Можно попробовать Перегрузка Java-операторов. Он имеет свои ограничения, но стоит попробовать, если вы действительно хотите использовать перегрузку оператора.
Ответ 7
Как многие другие ответили: Java не поддерживает пользовательскую перегрузку оператора.
Возможно, это не по теме, но я хочу прокомментировать некоторые вещи, которые я прочитал в некоторых ответах.
О читаемости.
Для сравнения:
Посмотрите еще раз!
Какой из них более читабельен?
Язык программирования, который позволяет создавать пользовательские типы, должен позволять им действовать так же, как и встроенные типы (или примитивные типы).
Итак, Java нарушает фундаментальный принцип общего программирования:
Мы должны иметь возможность обменивать объекты встроенных типов с объектами пользовательских типов.
(Возможно, вам интересно: "Он сказал" объекты встроенного "?" Да, см. Здесь.)
О конкатенации строк:
Математики используют symnol + для коммутативных операций над множествами.
Поэтому мы можем быть уверены, что a + b = b + a.
Конкатенация строк (в большинстве языков программирования) не учитывает эту общую математическую нотацию.
a := "hello";
b := "world";
c := (a + b = b + a);
или в Java:
String a = "hello";
String b = "world";
boolean c = (a + b).equals(b + a);
Extra:
Обратите внимание на то, как в Java равенство и идентичность сбиты с толку.
Символ == (равенство) означает:
а. Равенство для примитивных типов
б. Проверка идентичности для пользовательских типов, поэтому мы вынуждены использовать функцию equals() для равенства.
Но... Что это связано с перегрузкой оператора?
Если язык позволяет перегрузке оператора, пользователь может дать правильное значение оператору равенства.
Ответ 8
Просто используйте Xtend вместе со своим кодом Java. Он поддерживает перегрузку оператора:
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
}
}
На официальном сайте есть список методов для каждого оператора!
Ответ 9
Или вы можете сделать Java Groovy и просто перегрузить эти функции, чтобы достичь желаемого.
//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
Кто не хочет/использует groovy?: D
Нет, вы не можете использовать скомпилированные JAR файлы groovy в Java таким же образом. Это все еще ошибка компилятора для Java.
Ответ 10
В отличие от C++, Java не поддерживает пользовательскую перегрузку операторов. Перегрузка выполняется внутри Java, мы можем взять + (плюс) для ex: int a = 2 + 4;, string = "hello" + "world";
Здесь плюс добавляет два целых числа и объединяет две строки. Таким образом, мы можем сказать, что Java поддерживает внутреннюю перегрузку операторов, но не определяется пользователем.