Java - добавить поддержку в классе, чтобы разрешить умножение

В таких программах, как Unity3D, которые имеют Vector2/Vector3 и т. Д. (Я использую в программе кодирование C#), вы можете умножать объекты Vector в Unity на число с плавающей точкой, просто используя операнд '*' и не используя явных методов. Например:

Vector2 oldVector = new Vector2(10f, 10f);
Vector2 newVector = oldVector * -2f

И тогда newVector будет иметь значение (-20f, -20f).

В отличие от чего-то, используя такие методы, как:

Vector2 oldVector = new Vector2(10f, 10f);
Vector2 newVector = oldVector.multiply(-2f);

По сути, как бы вы сказали Java обработать это / внедрить в свой класс? Есть ли способ?

Я понимаю, что это может быть просто запутанным и что, вероятно, значительно проще использовать методы, но я чувствую, что было бы интересно изучить и, возможно, полезно на более позднем этапе.

2 ответа

Решение

Очень просто: Java не допускает перегрузки операторов; что является концепцией "скрытия" вызова метода таким образом.

По сути, вы видите, что код имеет дело с объектными / ссылочными типами в конце. Таким образом, даже когда другие языки позволяют вам писать "*" вместо "умножение"; в конце концов, есть метод, который вызывается.

По сути, это было решение, принятое специально, когда была внедрена Java. Многим не нравилась перегрузка операторов (указывая на C++, где такие вещи часто использовались неправильно); поэтому был сделан аргумент, что Java не должна допускать этого.

Если ваша главная задача - использовать * вместо умножения; Есть много других языков, которые работают на JVM (например, Scala), которые дают вам перегрузку операторов (но, честно говоря: Scala не имеет перегрузки операторов, но позволяет вам назвать ваш метод "*").

Проще говоря: вы не можете.

Java не поддерживает перегрузку операндов. Существуют другие языки, основанные на JVM (groovy, kotlin и scala), которые поддерживают его, но в конечном итоге они делают то же, что и ваш второй пример.

Подробно: спецификация Java не учитывает перегрузку операторов (например, здесь: https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html)

Другие вопросы по тегам