2009-11-06 42 views
126

¿Puede decirme si es posible sobrecargar a los operadores en Java? Si se usa en Java, ¿podría decirme al respecto?Sobrecarga del operador en Java

+0

duplicado posible de [¿Por qué no Java sobrecarga oferta del operador?] (Https://stackoverflow.com/questions/77718/why-doesnt-java-offer-operator-overloading) –

Respuesta

180

No, Java no es compatible con la sobrecarga del operador definida por el usuario. El único aspecto de Java que se acerca a la sobrecarga del operador "personalizado" es el manejo de + para cadenas, que da como resultado la concatenación de constantes en tiempo de compilación o la concatenación en tiempo de ejecución utilizando StringBuilder/StringBuffer. No puedes definir tus propios operadores que actúen de la misma manera.

Para un lenguaje similar a Java (JVM y basada en) la cual hace apoyo sobrecarga de operadores, que podía mirar a Groovy. Alternativamente, puede encontrar suerte con un Java compiler plugin solution.

+3

Usted está diciendo que no podemos crear envoltorio en java? ¿Como SmallInteger like Integer? –

+1

@ tuğrulbüyükışık: Ya existen envoltorios para todos los tipos primitivos existentes, pero si quisiera crear su propio tipo de envoltura nueva, no podría hacer que se comporte como los otros, ya que tienen soporte específico en el idioma . –

+1

gracias, busqué en Google y no pude encontrar. Quería saber si podría hacer una variable compleja compuesta de dos primitivos (un doble y un int ---> buena precisión + buen rango) –

14

No puede hacerlo usted mismo ya que Java no permite la sobrecarga del operador.

Con una excepción, sin embargo. + y + = están sobrecargados para objetos String.

+0

Downvoted ¿por qué? –

+5

Hay muchos otros ejemplos de sobrecarga de operador en Java. Por ejemplo, '&', '|' y '^' son sobrecargas para 'boolean' y tipos integrales. Y, de hecho, los operadores aritméticos y relacionales están sobrecargados por varios tipos numéricos. (Por supuesto, la semántica de las sobrecargas está mucho más cerca ...) –

29

La sobrecarga de operadores se utiliza en Java para la concatenación del tipo String:

String concat = "one" + "two"; 

Sin embargo, no puede definir sus propias sobrecargas de operadores.

14

Java no permite la sobrecarga del operador. El enfoque preferido es definir un método en su clase para realizar la acción: a.add(b) en lugar de a + b. Se puede ver un resumen de los otros bits de Java deja fuera de C como idiomas aquí: Features Removed from C and C++

+0

Enlace de interés – Wernsey

+2

Lo importante es el objetivo del diseño de hacer que los archivos fuente Java sean independientes del contexto. Intentar leer programas C macro pesados ​​(MLOC) muy grandes tiene una curva de aprendizaje muy larga. Un programa Java comparable (o más grande) no es más difícil de sumergir que un pequeño programa Java. Como dijo Gosling: Un lenguaje para programadores de cuello azul para trabajar. [Y cualquiera que piense que la verborrea estándar es perjudicial debería leer sobre fragmentar la cognición experta.] –

+1

Gracias a Oracle, ninguno de los enlaces de java.sun.com funciona. ¿Puedes dar el enlace actualizado, si es posible? –

20

Además de todas las personas que señala que + está sobrecargado para cuerdas, - también está sobrecargado para las operaciones de enteros y en coma flotante, como son * y /.

[editar] % también está sobrecargado para coma flotante, lo que puede ser un poco sorprendente para aquellos con un fondo C o C++.

10

Se puede probar Java Operator Overloading. Tiene sus propias limitaciones, pero vale la pena intentarlo si realmente quiere usar la sobrecarga del operador.

+0

O [light/JOps] (https://github.com/light/JOps) –

6

Simplemente use Xtend junto con su código Java. Es compatible con Sobrecarga de operadores:

package com.example; 

@SuppressWarnings("all") 
public class Test { 
    protected int wrapped; 

    public Test(final int value) { 
    this.wrapped = value; 
    } 

    public int operator_plus(final Test e2) { 
    return (this.wrapped + e2.wrapped); 
    } 
} 

package com.example 

class Test2 { 

    new() { 
     val t1 = new Test(3) 
     val t2 = new Test(5) 
     val t3 = t1 + t2 
    } 

} 

En el sitio web oficial, hay una lista de los métodos para poner en práctica para cada operador!

5

O bien, puede hacer que Java maravilloso y justo sobrecargar estas funciones para lograr lo que quiere

//plus() => for the + operator 
//multiply() => for the * operator 
//leftShift() = for the << operator 
// ... and so on ... 

class Fish { 
    def leftShift(Fish fish) { 
     print "You just << (left shifted) some fish " 
    } 
} 


def fish = new Fish() 
def fish2 = new Fish() 

fish << fish2 

Quién no quiere estar/use maravilloso? : D

No, no se pueden usar los JAR compilados groiled en Java de la misma manera. Todavía es un error de compilación para Java.

6

Como muchos otros han respondido: Java no es compatible con la sobrecarga del operador definida por el usuario.

Quizás esto no esté relacionado con el tema, pero quiero comentar algunas cosas que leí en algunas respuestas.

Acerca de la legibilidad.
Compare:

  1. c = a + b
  2. c = a.add (b)

mirar de nuevo!
¿Cuál es más legible?

Un lenguaje de programación que permite la creación de tipos definidos por el usuario, debe permitir que actúen de la misma manera que la incorporada en el tipo (o tipos primitivos).

Así Java rompe un principio fundamental de la programación genérica:
debemos ser capaces de intercambiar objetos de tipos integrados con objetos de tipos definidos por el usuario.
(usted puede preguntarse: "¿Dijo 'objetos de built-in'?" Sí, see here..)

Acerca de concatenación de cadenas:

matemáticos usan la symnol + para conmutativa operaciones en conjuntos.
Así que podemos estar seguros de que a + b = b + a.
La concatenación de cadenas (en la mayoría de los lenguajes de programación) no respeta esta notación matemática común.

a := "hello"; 
b := "world"; 
c := (a + b = b + a); 

o en Java:

String a = "hello"; 
String b = "world"; 
boolean c = (a + b).equals(b + a); 

adicional:
Note como en la igualdad y la identidad de Java están confundidos. El símbolo == (igualdad) significa:
a. Igualdad para los tipos primitivos
b. Verificación de identidad para los tipos definidos por el usuario, por lo tanto, estamos obligados a utilizar la función equals() para la igualdad.
Pero ... ¿Qué tiene esto que ver con la sobrecarga del operador?
Si el lenguaje permite la sobrecarga del operador, el usuario podría dar el significado adecuado al operador de igualdad.

+0

El símbolo '==' se usa para igualdad en Java, como en C y C++. Esto no tiene nada que ver con la sobrecarga del operador. –

+2

El operador ==, en Java solo significa Igualdad para tipos primitivos. Para los tipos definidos por el usuario, significa identidad. En C++, la semántica es definida por el usuario, pero debe preservar la semántica incorporada, la igualdad. Cadena a = "hola"; Cadena b = "hola"; booleano c = (a == b); –

+0

Sí, al igual que en C, que Java copió. Su queja es sobre Java en general y no tiene nada que ver con el * hecho * de que Java no admite la sobrecarga del operador. Cuando crea su propio idioma, puede definirlo de la manera que desee. –