Risposte:
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 .
BigInteger
in Java, quindi guarda il codice simile usando BigInteger
in 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.
m0
come Matrix
e v0
, v1
, v2
, v3
, e v4
come Vector
s, è 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;
.
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 ++.
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 ++
Non puoi farlo da solo poiché Java non consente il sovraccarico dell'operatore.
Con un'eccezione, tuttavia. + e + = sono sovraccarichi per gli oggetti String.
&
, |
e ^
sono overload per boolean
e tipi integrali. E in effetti, gli operatori aritmetici e relazionali sono sovraccarichi per vari tipi numerici. (Naturalmente, la semantica dei sovraccarichi è molto più vicina ...)
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:
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.
==
viene utilizzato per l'uguaglianza in Java, come in C e C ++. Ciò non ha nulla a che fare con il sovraccarico dell'operatore.
Si può provare il sovraccarico dell'operatore Java . Ha i suoi limiti, ma vale la pena provare se si desidera davvero utilizzare il sovraccarico dell'operatore.
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!
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.
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.