2012-01-17 25 views
5

estoy trabajando en un proyecto que tiene un objeto llamado Vector2¿Java soporta la sobrecarga del operador?

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)); 
     } 
    } 

y le gustaría hacer lo siguiente:

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 

Es esto posible? Si es así, ¿cómo puedo hacerlo y cómo se llama? Gracias por adelantado.

Respuesta

5

No, Java no es compatible con la sobrecarga del operador.

Como un FYI: si es posible que trabaje con otros idiomas, entonces C++ y, como el de Java, C# soportan la sobrecarga del operador. Si su proyecto, por ejemplo Ray Tracing, tiene muchas operaciones relacionadas con vectores, entonces consideraría un lenguaje como C#.

4

Java no permite la sobrecarga del operador como en idiomas como C++. Ver this article. Realiza funciones de utilidad para acomodar lo que quieres lograr.

4

No hay sobrecarga del operador en Java. Lo mejor que puedes hacer es usar un método.

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

Entonces, si a y b son Vector2 objetos que se pueden hacer esto

Vector2 c = a.multiply(b); 
1

Como dijo Nadir, que se llama "la sobrecarga de operadores" y (para mejor o peor) que no estaba incluido en el Java especificación. Puedes encontrarlo en C++ si quieres verlo en acción.

En Java, que había necesidad de añadir los siguientes métodos para la clase Vector2:

public Vector2 multiplyBy(Vector2 otherVector); 

public Vector2 multiplyBy(float multiplier); 
1

Lo que está haciendo se llama sobrecarga de operadores. Y aunque Java no lo admite (Google encuentra innumerables publicaciones y opiniones sobre el tema), algunos lenguajes de nivel superior que se ejecutan en JVM lo hacen, como Groovy. Entonces, si puede introducir a Groovy en su proyecto, puede lograrlo. Su código Groovy se compilará hasta el mismo bytecode de JVM, por lo que será totalmente interoperable con su Java y puede invocar Java existente en su proyecto.

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