web-dev-qa-db-fra.com

Surcharge des opérateurs dans Java

Pouvez-vous me dire s'il est possible de surcharger des opérateurs en Java? S'il est utilisé n'importe où dans Java, pourriez-vous m'en parler, s'il vous plaît.

167
Vipul

Non, Java ne prend pas en charge la surcharge d'opérateur définie par l'utilisateur. Le seul aspect de Java qui se rapproche de la surcharge d'opérateur "personnalisé" est le traitement de + pour les chaînes, ce qui entraîne soit une concaténation des constantes au moment de la compilation, soit une concaténation au moment de l'exécution à l'aide de StringBuilder/StringBuffer. Vous ne pouvez pas définir vos propres opérateurs qui agissent de la même manière cependant.

Pour un langage de type Java (et basé sur JVM) qui prend en charge la surcharge d'opérateurs, vous pouvez consulter Groovy . Alternativement, vous pourriez trouver de la chance avec un solution de plugin de compilateur Java .

221
Jon Skeet

La surcharge des opérateurs est utilisée dans Java pour la concaténation du type String:

String concat = "one" + "two";

Cependant, vous ne pouvez pas définir vos propres surcharges d'opérateur.

34
teabot

Outre toutes les personnes soulignant que + est surchargé pour les chaînes, - est également surchargé pour les opérations à virgule flottante et entière, comme le sont * et /.

[edit] % est également surchargé en virgule flottante, ce qui peut surprendre ceux qui ont un arrière-plan C ou C++.

25
MSalters

Java n'autorise pas la surcharge des opérateurs. L'approche préférée consiste à définir une méthode sur votre classe pour effectuer l'action suivante: a.add(b) au lieu de a + b. Vous pouvez voir un résumé des autres bits Java exclus du langage C comme les langages ici: Fonctionnalités supprimées du C et C++

17
rob

Vous ne pouvez pas le faire vous-même car Java n'autorise pas la surcharge de l'opérateur.

Avec une exception cependant. + et + = sont surchargés pour les objets String.

14
Brian Agnew

On peut essayer surcharge de l'opérateur Java . Il a ses propres limites, mais cela vaut la peine d'essayer si vous voulez vraiment utiliser la surcharge d'opérateur.

11

Comme beaucoup d’autres ont répondu: Java ne prend pas en charge la surcharge par les opérateurs définis par l’utilisateur.

C'est peut-être hors sujet, mais je voudrais commenter certaines choses que j'ai lues dans certaines réponses.

À propos de la lisibilité.
Comparer:

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

Regarde encore!
Lequel est le plus lisible?

Un langage de programmation qui permet la création de types définis par l'utilisateur doit leur permettre d'agir de la même manière que les types intégrés (ou types primitifs).

Donc, Java enfreint un principe fondamental de la programmation générique:
Nous devrions pouvoir échanger des objets de types intégrés avec des objets de types définis par l'utilisateur.
(Vous vous demandez peut-être: "At-il dit 'objets intégrés"? ". Oui, voir ici .)

À propos de la concaténation de chaînes:

Les mathématiciens utilisent le symnol + pour les opérations commutatives sur les ensembles.
On peut donc être sûr que a + b = b + a.
La concaténation de chaînes (dans la plupart des langages de programmation) ne respecte pas cette notation mathématique courante.

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

ou en Java:

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

Supplémentaire:
Remarquez comment Java égalité et identité sont confondues. Le symbole == (égalité) signifie:
une. Egalité pour les types primitifs
b. Contrôle d'identité pour les types définis par l'utilisateur, nous sommes donc obligés d'utiliser la fonction égale () pour l'égalité.
Mais ... Qu'est-ce que cela a à voir avec la surcharge de l'opérateur?
Si la langue permet à l'opérateur, surcharger l'utilisateur peut lui donner la signification appropriée.

10

Utilisez simplement Xtend avec votre code Java. Il supporte la surcharge de l'opérateur:

    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
    }

}

Sur le site officiel, vous trouverez une liste des méthodes à mettre en œuvre pour chaque opérateur!

6
Aurelien B

Ou bien, vous pouvez créer Java Groovy et simplement surcharger ces fonctions pour obtenir ce que vous voulez.

//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 ne veut pas être/utiliser groovy? :RÉ

Non, vous ne pouvez pas utiliser les fichiers JAR groovy compilés dans Java de la même manière. C'est toujours une erreur de compilation pour Java.

5
alknows

Contrairement à C++, Java ne prend pas en charge la surcharge par l'opérateur défini par l'utilisateur. La surcharge se fait en interne dans Java, on peut prendre + (plus) pour ex: int a = 2 + 4; , string = "bonjour" + "monde"; Ici, plus ajoute deux nombres entiers et concatène deux chaînes. On peut donc dire que Java prend en charge la surcharge interne des opérateurs mais pas celle définie par l'utilisateur.

0
nayanjyoti sharma