Перегрузка операторов в 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 не поддерживает пользовательскую перегрузку оператора.

Возможно, это не по теме, но я хочу прокомментировать некоторые вещи, которые я прочитал в некоторых ответах.

О читаемости.
Для сравнения:

  • c = a + b
  • c = a.add(b)

Посмотрите еще раз! Какой из них более читабельен?

Язык программирования, который позволяет создавать пользовательские типы, должен позволять им действовать так же, как и встроенные типы (или примитивные типы).

Итак, 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 поддерживает внутреннюю перегрузку операторов, но не определяется пользователем.