2012-01-17 2 views
5

я работаю над проектом, который имеет объект под названием Vector2Поддерживает ли Java поддержку перегрузки оператора?

public static class Vector2 { 
     public Vector2 (float x, float y) { 
      this.x = x; 
      this.y = y; 
     } 

     public float x; 
     public float y; 

     public static Vector2 ZERO = new Vector2 (0, 0); 
     public static Vector2 FORWARD = new Vector2 (0, 1); 
     public static Vector2 LEFT = new Vector2 (1, 0); 

     public static float Distance (Vector2 a, Vector2 b) { 
      return (float) Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2)); 
     } 
    } 

и хотел бы сделать следующее:

Vector2 a = new Vector2 (2.32, 453.12); 
Vector2 b = new Vector2 (35.32, 532.32); 

Vector2 c = a * b; 

// c.x = 2.32*35.32 
// c.y = 453.12*532.32 

float num = 5; 
c = a * num; 

// c.x = 2.32*5 
// c.y = 453.12*5 

Возможно ли это? Если да, то как я могу это сделать и что он называется? Заранее спасибо.

ответ

5

Нет, Java не поддерживает перегрузку оператора.

В качестве FYI: если вам удастся работать с другими языками, то C++ и, на самом деле, такие как Java, C# поддерживают перегрузку оператора. Если в вашем проекте, например, Ray Tracing, есть много операций, связанных с вектором, тогда я бы рассматривал такой язык, как C#.

4

Java не позволяет перегрузке оператора, например, на языках C++. См. this article. Сделайте функции утилит, чтобы выполнить то, что вы хотите выполнить.

4

В Java нет перегрузки оператора. Лучшее, что вы можете сделать, это использовать метод.

public Vector2 multiply(Vector2 that){ 
    return new Vector2(this.x * that.x, this.y * that.y); 
} 

Тогда если a и b являются Vector2 объекты, которые вы можете сделать это

Vector2 c = a.multiply(b); 
1

Как сказал Надир, это называется «перегрузка оператора» и (лучше или хуже), он не был включен в Java Спецификация. Вы можете найти его на C++, если хотите увидеть его в действии.

В Java, вам нужно добавить следующие методы для вашего Vector2 класса:

public Vector2 multiplyBy(Vector2 otherVector); 

public Vector2 multiplyBy(float multiplier); 
1

Что вы делаете, называется оператором перегрузки. И хотя Java не поддерживает его (Google, чтобы найти множество сообщений и мнений по этой теме), некоторые языки более высокого уровня, которые работают на JVM, как, например, Groovy. Поэтому, если вы можете представить Groovy в свой проект, вы можете это сделать. Ваш код Groovy будет скомпилирован с одним байт-кодом JVM, поэтому он будет полностью совместим с вашей Java и может вызывать существующую Java в вашем проекте.

http://groovy.codehaus.org/Operator+Overloading

Смежные вопросы