Можно ли создать собственный оператор в Java?

Подобно Можно ли создать новый оператор в C # ?, можно ли создать свой оператор для Java? Сначала я бы сказал нет, поскольку вы не можете перегрузить, но опять же, String поддерживает + и + = (неявно через StringBuilder во время выполнения и т. Д.).


person ahodder    schedule 23.04.2012    source источник


Ответы (6)


Java этого не допускает.

Однако, если вы хотите добиться такого синтаксиса, имея возможность запускать свой код на JVM (и с другим кодом Java), вы можете посмотреть на Groovy, в котором есть перегрузка оператора (и с которой вы также можете использовать DSL для краткого синтаксиса, который будет иметь эффект, аналогичный использованию пользовательских операторов).

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

person Bruno    schedule 23.04.2012
comment
Тем не менее, отказ от перегрузки операторов в Java был очень осознанным решением - возможно, вам будет лучше избегать таких вещей. - person Louis Wasserman; 24.04.2012
comment
@LouisWasserman: как я уже говорил в другом комментарии, я понимаю решение, но, к сожалению, это не делает Java очень подходящей для математического программирования. С матрицами a.multiply(b.multiply(c.add(d)).add(e)) не очень хорошо ... NumPy хорошо использует перегрузку операторов в Python. - person Bruno; 24.04.2012
comment
Мертвая ссылка? У меня не загружается. - person Aaron Franke; 11.04.2018

Нет, таким образом Java не расширяется. Вы не можете добавлять операторы и даже больше не можете перегружать встроенные операторы, такие как + - даже стандартные библиотечные классы, такие как BigInteger, должны использовать такие методы, как add(), а не такие операторы, как +.

Scala (еще один статический язык JVM) обходит это, используя вызовы методов, а не встроенные операторы, и разрешая любые символы в именах методов, поэтому вы можете определять новые методы, которые выглядят как операторы, т.е.

a + 1

синтаксический сахар для:

a.+(1)
person DNA    schedule 23.04.2012

Нет, в Java нельзя перегружать специальные символы для операторов.

person Riley Lark    schedule 23.04.2012
comment
Я не прошу перегружать. Прошу создать новый символ. - person ahodder; 24.04.2012
comment
в вашем вопросе вы использовали термины новый и перегрузка, поэтому это немного сбивает с толку. - person Kevin Welker; 24.04.2012

Как уже говорили все остальные, вы абсолютно не можете добавлять новые операторы в Java. Однако другие языки JVM, дружественные к Java, например Groovy, позволяют определять новые операторы из существующих токенов операторов.

person Kevin Welker    schedule 23.04.2012

Нет. Прочтите эту статью, чтобы узнать, почему они не должны быть такими: http://java.dzone.com/articles/why-java-doesnt-need-operator

Вы можете использовать другой язык, например Scala, для достижения этого на платформе java. - https://stackoverflow.com/a/1991348/1342121

person ianpojman    schedule 23.04.2012
comment
Эта статья явно написана кем-то, кто не работал с числовым кодом на Java. Возможность умножения матриц с перегрузкой оператора с помощью NumPy в Python (например) очень удобна для удобочитаемости по сравнению с необходимостью вызывать подобные _ 1_ везде. - person Bruno; 24.04.2012
comment
согласен ... Я совсем не много этим занимался, и язык Java не кажется лучшим выбором для этого. Платформа Java отлично подходит для этого - person ianpojman; 26.04.2012

Нет. Java не допускает перегрузки операторов. Дополнительное обсуждение можно увидеть здесь: https://javarevisited.blogspot.com/2011/08/why-java-does-not-support-operator.html

person logbasex    schedule 07.02.2020
comment
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится. - Из отзыва - person David Buck; 07.02.2020
comment
@DavidBuck, ответ: Нет. Java не допускает перегрузки оператора., ссылка просто подтверждает это утверждение. Другими словами, это не ответ только по ссылке. - person Mark Rotteveel; 07.02.2020
comment
@DavidBuck, MarkRotteveel: Изначально я собирался написать комментарий, но моей репутации было недостаточно. Спасибо за вашу доброту, я буду лучше в следующий раз как участник. - person logbasex; 08.02.2020