Sobrecarga del operador en Java

Respuestas:

235

No, Java no admite la sobrecarga del operador definido 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 usando StringBuilder / StringBuffer. Sin embargo, no puede definir sus propios operadores que actúen de la misma manera.

Para un lenguaje similar a Java (y basados en JVM), que hace la sobrecarga de operadores de apoyo, usted podría mirar a Kotlin o maravilloso . Alternativamente, puede encontrar suerte con una solución de complemento del compilador de Java .

Jon Skeet
fuente
44
¿Estás diciendo que no podemos crear wrapper en java? ¿Como SmallInteger como Integer?
huseyin tugrul buyukisik
3
@ tuğrulbüyükışık: ya hay envoltorios para todos los tipos primitivos existentes, pero si quisieras crear tu propio tipo de envoltorio nuevo, no podrías hacer que se comporte como los demás, ya que tienen soporte específico en el idioma.
Jon Skeet
1
gracias, busqué en Google y no pude encontrar. Yo quería saber si podía hacer una variable compleja compuesta de dos primitivas (un doble y un int ---> buena precisión + rango bueno)
Huseyin tugrul buyukisik
40
@djaqeel: la sobrecarga del operador hace que el código sea menos legible cuando se usa mal . Cuando se usa bien, puede mejorar enormemente la legibilidad IMO. Mire el código que usa BigIntegeren Java, luego mire código similar usando BigIntegeren C # usando operadores. No veo cómo los delegados rompen los principios de OOP: debe ser mucho más preciso que eso en sus objeciones. No conozco los detalles de por qué los diseñadores de Java no incluyeron varias características, pero sospecho que hay una mezcla de presión de recursos y un deseo de mantener el lenguaje pequeño y relativamente simple.
Jon Skeet
44
Sé que es tarde, pero un ejemplo vale más que mil argumentos. Teniendo en cuenta m0como Matrixy v0, v1, v2, v3, y v4como Vectors, basta con comparar el tiempo que le lleva a correctamente interpretar la siguiente expresión matemática m0.transpose().mult(v0.add(v1.mult(v2)).cross(v3)).sub(v4);. Si se hubiera incluido el soporte para la sobrecarga del operador, podría haberse escrito como m0.transpose() * (v0 + v1 * v2).cross(v3) - v4;.
code_dredd
38

La sobrecarga del operador se utiliza en Java para la concatenación del tipo de cadena:

String concat = "one" + "two";

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

teabot
fuente
26

Además de todas las personas que señalan que +está sobrecargado para Strings, -también está sobrecargado para operaciones de punto flotante y entero, como son *y /.

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

MSalters
fuente
21

Java no permite la sobrecarga del operador. El enfoque preferido es definir un método en su clase para realizar la acción: en a.add(b)lugar de a + b. Puede ver un resumen de los otros bits que Java dejó de los lenguajes similares a C aquí: Características eliminadas de C y C ++

robar
fuente
2
Lo importante es el objetivo del diseño de hacer que los archivos fuente Java sean independientes del contexto. Intentando leer programas muy grandes (MLOC), macropesados ​​C tiene una curva de aprendizaje muy larga. No es más difícil sumergirse en un programa Java comparable (o más grande) que un pequeño programa Java. Como dijo Gosling: Un lenguaje para que trabajen los programadores de cuello azul. [Y cualquiera que piense que la verbosidad repetitiva es perjudicial, debería leer sobre la fragmentación en la cognición experta.]
Tim Williscroft
2
Gracias a Oracle, ninguno de los enlaces de java.sun.com funciona. ¿Puede dar el enlace actualizado, si es posible?
Syed Aqeel Ashiq
17

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 los objetos String.

Brian Agnew
fuente
8
Hay muchos otros ejemplos de sobrecarga de operadores en Java. Por ejemplo &, |y ^son sobrecarga para booleany tipos integrales. Y, de hecho, los operadores aritméticos y relacionales están sobrecargados para varios tipos numéricos. (Por supuesto, la semántica de las sobrecargas está mucho más cerca ...)
Stephen C
16

Como muchos otros han respondido: Java no admite la sobrecarga del operador definido por el usuario.

Quizás esto esté fuera de tema, pero quiero comentar algunas cosas que leí en algunas respuestas.

Sobre la legibilidad.
Comparar:

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

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

Un lenguaje de programación que permita la creación de tipos definidos por el usuario, debería permitirles actuar de la misma manera que los tipos incorporados (o tipos primitivos).

Entonces, Java rompe un principio fundamental de la Programación Genérica:
Deberíamos poder intercambiar objetos de tipos incorporados con objetos de tipos definidos por el usuario.
(Quizás se esté preguntando: "¿Dijo 'objetos incorporados'?". Sí, vea aquí ).

Sobre la concatenación de cadenas:

Los matemáticos usan el símbolo + para operaciones conmutativas en conjuntos.
Entonces 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);

Extra:
Observe cómo en Java se confunden igualdad e identidad. El símbolo == (igualdad) significa:
a. Igualdad para los tipos primitivos.
si. Verificación de identidad para tipos definidos por el usuario, por lo tanto, nos vemos obligados a usar la función equals () para igualdad.
Pero ... ¿Qué tiene esto que ver con la sobrecarga del operador?
Si el lenguaje permite que el operador sobrecargue, el usuario podría darle el significado apropiado al operador de igualdad.

Fernando Pelliccioni
fuente
El símbolo ==se usa para la igualdad en Java, como en C y C ++. Esto no tiene nada que ver con la sobrecarga del operador.
Hot Licks
2
El operador ==, en Java solo significa Igualdad para tipos primitivos. Para los tipos definidos por el usuario significa identidad. En C ++, el usuario define la semántica, pero debe preservar la semántica incorporada, igualdad. Cadena a = "hola"; Cadena b = "hola"; booleano c = (a == b);
Fernando Pelliccioni
3
Entonces, lo que dijiste en tu primer comentario está mal. ¿Correcto? Por favor, dígame cómo probar la igualdad y la identidad en tipos definidos por el usuario en C. Tiene razón, mi comentario sobre la igualdad es OT, pero lo aclaré (vea los "extras"). El hecho de que no haya creado un lenguaje de programación no significa que no pueda criticar uno existente. Lo siento si has visto las críticas como una guerra religiosa.
Fernando Pelliccioni
1
En pocas palabras: Java apesta.
Kolya Ivankov
12

Uno puede probar la sobrecarga del operador de Java . Tiene sus propias limitaciones, pero vale la pena intentarlo si realmente desea utilizar la sobrecarga del operador.

Alexander Mironov
fuente
6

Simplemente use Xtend junto con su código Java. Soporta sobrecarga del operador:

    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 a implementar para cada operador!

Aurelien B
fuente
5

O bien, puede hacer Java Groovy y simplemente sobrecargar estas funciones para lograr lo que desea

//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 ser / usar groovy? :RE

No, no puede usar los JAR geniales compilados en Java de la misma manera. Todavía es un error del compilador para Java.

Alcnows
fuente
1

A diferencia de C ++, Java no admite la sobrecarga del operador definido por el usuario. La sobrecarga se realiza internamente en Java.

Podemos tomar +(más) por ejemplo:

int a = 2 + 4;
string = "hello" + "world";

Aquí, más agrega dos números enteros y concatena dos cadenas. Por lo tanto, podemos decir que Java admite la sobrecarga interna del operador, pero no la define el usuario.

nayanjyoti sharma
fuente