2013-07-29 12 views
5

È possibile definire un parametro x in un metodo, in modo tale che il tipo di x sia un tipo generico T che implementa una determinata firma di funzione (diciamo def apply() : Double), senza introdurre un nuovo tipo?Scala e tipo associato a una determinata operazione

[Esempio] L'obiettivo è quello di definire qualcosa di simile (sto usando una sintassi adhoc solo per il gusto di illustrazione):

def foo(x : T with def apply() : Double) = { ... }

Attualmente, ho potuto introdurre un nuovo tipo ApplyDouble, ma che richiederebbe me si estende tutti i possibili tipi le cui istanze sono parametri legali per 'foo', e la firma di foo sarebbe poi trasformato in

def foo(x : ApplyDouble) = { ... }

risposta

8

S Ure, è possibile con un tipo strutturale, e hai anche quasi ottenuto il diritto sintassi:

def foo(x: { def apply(): Double }) = x.apply 

E poi:

scala> foo(() => 13.0) 
res0: Double = 13.0 

Oppure:

scala> foo(new { def apply() = 42.0 }) 
res1: Double = 42.0 

La definizione di foo ti fornirà un avviso sull'accesso riflettente, che puoi evitare aggiungendo un'opzione di importazione o compilatore (come descritto nel messaggio di avviso).

Nota che c'è un sovraccarico nel chiamare i metodi su un tipo strutturale, quindi se hai bisogno di questo in un anello chiuso ti consigliamo di ripensare il tuo approccio un po '. Nella maggior parte dei casi, tuttavia, probabilmente non farà una differenza evidente.

+0

Grazie. Questo è esattamente quello che stavo cercando;) – leco

Problemi correlati