2014-07-17 12 views
8

Mi chiedevo se esiste una possibilità in Java 8, per ottenere i riferimenti al metodo degli operatori standard (+, -, <,>, ...).Java 8: Get Operator-Function-Object con metodo di riferimento

Voglio ottenerlo come Foo::+ dove Foo è un luogo definito in cui posso ottenerlo. Poiché Java non consente caratteri speciali nei nomi dei metodi, non penso sia possibile, vero?

Se il modo sopra non esiste: esiste un luogo in cui gli operatori standard sono definiti come Foo::plus?

So che esiste la possibilità di definirlo come lambda ((x, y) -> x + y), ma a mio parere potrebbe essere più espressivo in alcuni casi con un riferimento al metodo dell'operatore come è possibile in Haskell.

risposta

7

Credo che stiate cercando int Integer.sum(int, int) e metodi simili, che sono forniti dall'API.

Ci sono molti metodi mancanti nell'elenco, ma è normale che JDK non fornisca l'ultimo centimetro di convenienza perché le sue dimensioni sono enormi anche senza quelle.

Se questa è una consolazione, ognuno dei miei progetti ha una classe Util in cui scarico informazioni come queste.

+0

Operatori come>, <, anche? Non so dove guardare. –

+0

C'è qualche posto dove forse sono definiti tutti gli operatori? Qualche classe con solo metodi statici, forse di nome 'Ops' o qualcosa del genere? –

+0

No, non la penso così. C'è 'Integer.compare', ma dovresti comunque scrivere del codice per ottenere predicati booleani. –

0

Gli operatori standard si applicano solo a primitive e primitive in scatola e non è possibile trovare in modo dinamico quali operatori sono applicabili all'oggetto in questione.

Edit: Se vuoi sapere quale metodo di che si potrebbe chiamare per eseguire le funzioni di operatore standard, è possibile fare un controllo instanceof all'interfaccia comparabile per i maggiore/minore o uguale operatori (http://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html).

+0

"Gli operatori standard si applicano solo a primitive e primitive in scatola e non è possibile trovare in modo dinamico quali operatori siano applicabili all'oggetto in questione." Non lo capisco. Penso che il compilatore possa scoprirlo, se i tipi sono adatti. (Beh, forse il mio inglese è semplicemente troppo brutto per capirlo ;-)) –

+0

Ok, mentre implementi '<' Capisco cosa intendi. Non è possibile fare '<' con il 'numero della superclasse'. –

+0

L'unico operatore che lavora sugli oggetti è ==. Questo perché non confronta effettivamente gli oggetti ma solo il riferimento (il puntatore se hai familiarità con C++). Quindi se 2 oggetti hanno lo stesso contenuto, ma non sono la stessa istanza di oggetto, non torneranno ancora true sull'operatore ==. – grimmeld

1

Un modo pulito sarebbe una classe helper Operators che contiene metodi per tutti gli operatori. Quindi potresti usare questi metodi come riferimenti. Naturalmente, una classe di librerie standard sarebbe più bella di una propria classe di helper, ma almeno si può decidere il nome di quella classe di helper, quindi è possibile scegliere un nome che è più espressivo per voi.

Problemi correlati