Почему Java не предлагает перегрузку операторов? - PullRequest
385 голосов
/ 17 сентября 2008

Переходя от C ++ к Java, очевидный вопрос без ответа состоит в том, почему Java не включает перегрузку операторов?

Разве Complex a, b, c; a = b + c; не намного проще, чем Complex a, b, c; a = b.add(c);?

Существует ли известная причина для этого, допустимые аргументы для , не допускающие перегрузку операторов? Причина произвольна или потеряна для времени?

Ответы [ 15 ]

4 голосов
/ 12 сентября 2009

Сказать, что перегрузка оператора приводит к логическим ошибкам типа, что оператор не соответствует логике операции, это все равно, что ничего не сказать. Тот же тип ошибки произойдет, если имя функции не подходит для логики работы - так в чем же решение: отбросьте возможность использования функции !? Это комичный ответ - «Не подходит для логики работы», каждое имя параметра, каждый класс, функция или что-либо может быть логически неуместным. Я думаю, что эта опция должна быть доступна на респектабельном языке программирования, и те, кто считает его небезопасным - эй, нет, они оба говорят, что вы должны его использовать. Давайте возьмем C #. Они опустили указатели, но, эй - есть заявление «небезопасный код» - программируйте на свой страх и риск.

2 голосов
/ 17 сентября 2008

Если предположить, что Java является языком реализации, тогда a, b и c будут ссылками на тип Complex с начальными значениями null. Кроме того, предполагая, что Complex является неизменяемым как упомянутый BigInteger и аналогичный неизменяемый BigDecimal , я думаю, что вы имеете в виду следующее, поскольку вы назначаете ссылку на Complex, возвращаемую после добавления b и c, и не сравнивая эту ссылку с a.

Не является:

Complex a, b, c; a = b + c;

намного проще, чем:

Complex a, b, c; a = b.add(c);
1 голос
/ 17 сентября 2008

Иногда было бы неплохо иметь перегрузку операторов, классы друзей и множественное наследование.

Однако я все еще думаю, что это было хорошее решение. Если бы в Java была бы перегрузка операторов, мы никогда не могли бы быть уверены в значениях операторов, не просматривая исходный код. В настоящее время это не обязательно. И я думаю, что ваш пример использования методов вместо перегрузки операторов также вполне читабелен. Если вы хотите сделать вещи более понятными, вы всегда можете добавить комментарий к волосатым заявлениям.

// a = b + c
Complex a, b, c; a = b.add(c);
0 голосов
/ 06 августа 2018

Альтернативы встроенной поддержке перегрузки операторов Java

Поскольку в Java нет перегрузки операторов, вот несколько альтернатив, на которые вы можете посмотреть:

  1. Используйте другой язык. И Groovy , и Scala имеют перегрузку операторов и основаны на Java.
  2. Используйте java-oo , плагин, который позволяет перегрузить оператор в Java. Обратите внимание, что он НЕ зависит от платформы. Кроме того, у него много проблем, и он не совместим с последними выпусками Java (то есть Java 10). ( Оригинальный источник StackOverflow )
  3. Используйте JNI , собственный интерфейс Java или альтернативные варианты. Это позволяет вам писать методы на C или C ++ (может быть, другие?) Для использования в Java. Конечно, это также НЕ зависит от платформы.

Если кто-то знает о других, пожалуйста, прокомментируйте, и я добавлю его в этот список.

0 голосов
/ 29 января 2018

Это не веская причина для запрета, а практическая:

Люди не всегда используют это ответственно. Посмотрите на этот пример из библиотеки Python scapy:

>>> IP()
<IP |>
>>> IP()/TCP()
<IP frag=0 proto=TCP |<TCP |>>
>>> Ether()/IP()/TCP()
<Ether type=0x800 |<IP frag=0 proto=TCP |<TCP |>>>
>>> IP()/TCP()/"GET / HTTP/1.0\r\n\r\n"
<IP frag=0 proto=TCP |<TCP |<Raw load='GET / HTTP/1.0\r\n\r\n' |>>>
>>> Ether()/IP()/IP()/UDP()
<Ether type=0x800 |<IP frag=0 proto=IP |<IP frag=0 proto=UDP |<UDP |>>>>
>>> IP(proto=55)/TCP()
<IP frag=0 proto=55 |<TCP |>>

Вот объяснение:

Оператор / использовался как оператор композиции между двумя слои. При этом нижний слой может иметь один или несколько поля по умолчанию перегружены в соответствии с верхним уровнем. (Ты все еще может дать значение, которое вы хотите). Строка может использоваться в качестве необработанного слоя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...