Operatore sovraccarico in Java


Risposte:


235

No, Java non supporta il sovraccarico dell'operatore definito dall'utente. L'unico aspetto di Java che si avvicina al sovraccarico dell'operatore "personalizzato" è la gestione di + per le stringhe, che si traduce in una concatenazione in fase di compilazione delle costanti o in una concatenazione in fase di esecuzione utilizzando StringBuilder / StringBuffer. Non puoi definire i tuoi operatori che agiscono allo stesso modo però.

Per un linguaggio Java-like (e JVM-based), che fa supporto operatore overloading, si poteva guardare Kotlin o Groovy . In alternativa, potresti trovare fortuna con una soluzione di plug-in di compilatore Java .


4
Stai dicendo che non possiamo creare wrapper in Java? Come SmallInteger come Integer?
huseyin tugrul buyukisik,

3
@ tuğrulbüyükışık: esistono già wrapper per tutti i tipi primitivi esistenti, ma se si desidera creare il proprio nuovo tipo di wrapper, non si è in grado di farlo comportare come gli altri, poiché hanno un supporto specifico nella lingua.
Jon Skeet,

1
grazie, ho cercato su Google e non sono riuscito a trovarlo. Volevo sapere se potevo creare una variabile complessa composta da due primitive (una doppia e una int ---> buona precisione + buona gamma)
huseyin tugrul buyukisik

40
@djaqeel: l'overloading dell'operatore rende il codice meno leggibile se usato male . Se usato bene, può migliorare notevolmente la leggibilità IMO. Guarda il codice che utilizza BigIntegerin Java, quindi guarda il codice simile usando BigIntegerin C # usando gli operatori. Non vedo come i delegati infrangano i principi OOP - devi essere molto più preciso di quello nelle tue obiezioni. Non conosco i dettagli del perché i progettisti Java non abbiano incluso varie funzionalità, ma sospetto che ci sia un misto di pressione delle risorse e desiderio di mantenere il linguaggio piccolo e relativamente semplice.
Jon Skeet,

4
So che è tardi, ma un esempio vale più di mille argomenti. Dato m0come Matrixe v0, v1, v2, v3, e v4come Vectors, è sufficiente confrontare quanto tempo ci vuole a modo corretto interpretare la seguente espressione matematica m0.transpose().mult(v0.add(v1.mult(v2)).cross(v3)).sub(v4);. Se fosse stato incluso il supporto per il sovraccarico dell'operatore, avrebbe potuto essere scritto come m0.transpose() * (v0 + v1 * v2).cross(v3) - v4;.
code_dredd,

38

Il sovraccarico dell'operatore viene utilizzato in Java per la concatenazione del tipo String:

String concat = "one" + "two";

Tuttavia, non è possibile definire sovraccarichi dell'operatore.


26

Oltre a tutte le persone che indicano che +è sovraccarico per le stringhe, -è anche sovraccarico sia per le operazioni a virgola mobile che per quelle intere, come lo sono *e /.

[modifica] %è anche sovraccarico di virgola mobile, il che può essere un po 'una sorpresa per quelli con uno sfondo C o C ++.


21

Java non consente il sovraccarico dell'operatore. L'approccio preferito è definire un metodo sulla tua classe per eseguire l'azione: a.add(b)anziché a + b. Puoi vedere un riepilogo degli altri bit che Java ha lasciato fuori da C come le lingue qui: Funzionalità rimosse da C e C ++


2
L'importante è l'obiettivo di progettazione di rendere indipendente il contesto dei file sorgente Java. Cercando di leggere programmi C molto grandi (MLOC), macro pesanti ha una curva di apprendimento molto lunga. Un programma Java comparabile (o più grande) non è più difficile da approfondire rispetto a un piccolo programma Java. Come diceva Gosling: un linguaggio su cui lavorare per i programmatori di colletti blu. [E chiunque pensi che la verbosità della targhetta sia dannosa dovrebbe leggere sui blocchi nella cognizione degli esperti.]
Tim Williscroft,

2
Grazie a Oracle, nessuno dei collegamenti java.sun.com funziona. Potete per favore fornire il link aggiornato, se possibile?
Syed Aqeel Ashiq,

17

Non puoi farlo da solo poiché Java non consente il sovraccarico dell'operatore.

Con un'eccezione, tuttavia. + e + = sono sovraccarichi per gli oggetti String.


8
Esistono molti altri esempi di sovraccarico dell'operatore in Java. Ad esempio &, |e ^sono overload per booleane tipi integrali. E in effetti, gli operatori aritmetici e relazionali sono sovraccarichi per vari tipi numerici. (Naturalmente, la semantica dei sovraccarichi è molto più vicina ...)
Stephen C,

16

Come molti altri hanno risposto: Java non supporta il sovraccarico dell'operatore definito dall'utente.

Forse questo è fuori tema, ma voglio commentare alcune cose che ho letto in alcune risposte.

Informazioni sulla leggibilità.
Confrontare:

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

Guarda di nuovo!
Quale è più leggibile?

Un linguaggio di programmazione che consente la creazione di tipi definiti dall'utente, dovrebbe consentire loro di agire allo stesso modo dei tipi predefiniti (o tipi primitivi).

Quindi Java infrange un principio fondamentale della Programmazione generica:
dovremmo essere in grado di scambiare oggetti di tipo incorporato con oggetti di tipo definito dall'utente.
(Forse ti starai chiedendo: "Ha detto 'oggetti da incasso'?". Sì, vedi qui .)

Informazioni sulla concatenazione di stringhe:

I matematici usano il simbolo + per le operazioni commutative sui set.
Quindi possiamo essere sicuri che a + b = b + a.
La concatenazione di stringhe (nella maggior parte dei linguaggi di programmazione) non rispetta questa comune notazione matematica.

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

o in Java:

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

Extra:
nota come l'uguaglianza e l'identità di Java siano confuse. Il simbolo == (uguaglianza) significa:
a. Uguaglianza per i tipi primitivi.
b. Controllo dell'identità per tipi definiti dall'utente, pertanto, siamo costretti a utilizzare la funzione equals () per l'uguaglianza.
Ma ... Cosa c'entra questo con il sovraccarico dell'operatore?
Se la lingua consente all'operatore di sovraccaricare l'utente potrebbe dare il giusto significato all'operatore di uguaglianza.


Il simbolo ==viene utilizzato per l'uguaglianza in Java, come in C e C ++. Ciò non ha nulla a che fare con il sovraccarico dell'operatore.
Hot Licks,

2
L'operatore ==, in Java significa solo uguaglianza per i tipi primitivi. Per tipi definiti dall'utente significa identità. In C ++ la semantica è definita dall'utente, ma dovrebbe preservare la semantica incorporata, l'uguaglianza. String a = "ciao"; String b = "ciao"; booleano c = (a == b);
Fernando Pelliccioni,

3
Quindi quello che hai detto nel tuo primo commento è sbagliato. Destra? Per favore, dimmi come testare l'uguaglianza e l'identità sui tipi definiti dall'utente in C. Hai ragione, il mio commento sull'uguaglianza è OT, ma ho chiarito che (vedi gli "extra"). Il fatto che non abbia creato un linguaggio di programmazione non significa che non posso criticare un linguaggio esistente. Mi dispiace se hai visto le critiche come una guerra religiosa.
Fernando Pelliccioni,

1
Per farla breve: java fa schifo.
Kolya Ivankov,


6

Usa Xtend insieme al tuo codice Java. Supporta il sovraccarico dell'operatore:

    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
    }

}

Sul sito Web ufficiale è presente un elenco dei metodi da implementare per ciascun operatore!


5

Oppure, puoi creare Java Groovy e semplicemente sovraccaricare queste funzioni per ottenere ciò che desideri

//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

Chi non vuole essere / usare groovy? : D

No, non è possibile utilizzare i JAR groovy compilati in Java allo stesso modo. È ancora un errore del compilatore per Java.


1

A differenza di C ++, Java non supporta il sovraccarico dell'operatore definito dall'utente. Il sovraccarico è fatto internamente in Java.

Possiamo prendere +(più) per esempio:

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

Qui, plus aggiunge due numeri interi e concatena due stringhe. Quindi possiamo dire che Java supporta il sovraccarico dell'operatore interno ma non definito dall'utente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.