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)