Не перегружает ли язык Java некоторые операторы?
ДА! Как вы узнали, оператор +
может означать две разные вещи: конкатенацию строк или сложение чисел. Это по определению , перегрузка оператора.
Вот список всех операторов Java:
Следующие 37 токенов являются операторами , сформированными из символов ASCII:
= > < ! ~ ? :
== <= >= != && || ++ --
+ - * / & | ^ % << >> >>>
+= -= *= /= &= |= ^= %= <<= >>= >>>=
Некоторые из этих операторов перегружены. Вот несколько примеров:
System.out.println( 3 + 4 + "X" ); // prints "7X"
System.out.println( 3 + (4 + "X") ); // prints "34X"
System.out.println( "X" + 3 + 4 ); // prints "X34"
System.out.println( "X" + (3 + 4) ); // prints "X7"
System.out.println(0 == 0); // prints "true"
System.out.println(new Integer(0) == new Integer(0)); // prints "false"
System.out.println(true & (1 & 2) == 12); // prints "false"
Можем ли мы перегрузить операторы, определенные в языке Java?
АБСОЛЮТНО НЕТ! Все операторы Java означают точно , как указано в спецификации языка. Не существует "экстралингвистической" семантики: оператор Java может НИКОГДА делать то, что не определено языком.
То есть , если язык не меняется , следующие гарантированные истины:
someString + whatever
- это ВСЕГДА конкатенация строк
referenceType == anotherReferenceType
равно ВСЕГДА равенство ссылок
- Никаких прикольных вещей вроде
3 * "a lady"
или "my heart" / 2
или даже 10**3 ~= 999
Как видно из приведенного выше фрагмента, даже текущее состояние перегрузки операторов может быть довольно запутанным, особенно для начинающих. Не допуская дополнительных лингвистических перегрузок, по крайней мере, эта путаница ограничена: как только программист узнает о том, что все операторы в языке Java делают в различных перегруженных сценариях, их точная семантика в все Java-код становится ясным и точным.
Перегрузка оператора может привести к путанице. Некоторые считают, что это "достаточно плохо", как есть. Предоставление пользователям возможности перегружать операторы Java для выполнения действий, выходящих за рамки спецификации языка, может привести к еще большей путанице.
Вот выдержка из Java Puzzlers , Головоломка 30: Сын Лупера :
Урок для языковых дизайнеров такой же, как [две другие загадки]. Перегрузка оператора может привести к путанице. Возможно, оператор +
не должен был быть перегружен для конкатенации строк. Возможно, стоит добавить оператор конкатенации строк, но это не обязательно должно быть +
.
Вам нужен C ++ для поддержки перегрузки операторов в Java?
NOPE! Это не имеет к этому никакого отношения вообще . Все, что нужно сделать компилятору Java, - это проанализировать исходный код программы в соответствии с грамматическими правилами языка и определить для каждого оператора, какие типы операндов есть. Этой информации достаточно, чтобы понять, что означает оператор, и затем действовать соответственно, как указано языком.
Приложение
Ссылки JLS
Выявление вопросов