2010-07-31 14 views
5

Ho bisogno di avere una raccolta di funzioni generiche, ma non riesco a farlo nel modo che preferisco. Ho creato unScala: problemi con le funzioni come oggetti di prima classe

List[(Any)=>Unit] 

ma non appena provo ad inserire una funzione, ad esempio, un

String=>Unit 

ottengo un errore. Come posso dichiarare una collezione di funzioni generiche che non considera i tipi di parametri e valori restituiti?

risposta

9

Proprio alla fine della risposta @Moritz 's, è necessario scegliere il tipo di argomento per T1 che è un sottotipo del tipo di ingresso di ogni funzione nella lista. Nothing si adatta al conto: è un sottotipo di ogni tipo.

scala> val l: List[Nothing => Any] = List((b: String) => b, (a: Int) => a) 
l: List[(Nothing) => Any] = List(<function1>, <function1>) 

Un tipo esistenziale funziona anche:

scala> val l: List[_ => _] = List((b: String) => b, (a: Int) => a)   
l: List[Function1[_, _]] = List(<function1>, <function1>) 
+0

Come chiameresti una funzione con la firma '(Niente) => Any'? –

+0

Non puoi, senza un cast. Ma la domanda non ha richiesto questo :) – retronym

+0

C'è un modo per ottenere dinamicamente (magari attraverso la riflessione) il tipo effettivo della funzione, in modo che io possa eseguire il cast? – mariosangiorgio

11

Le funzioni sono controvarianti nei parametri del tipo di immissione, ad es. nel tuo caso Function1[-T1,+R]. Ciò significa che è possibile aggiungere un'istanza di Any => Unit a List[String => Unit] ma non viceversa. Ciò ovviamente ha senso poiché non è possibile chiamare una funzione che prevede un argomento di tipo String con un argomento di tipo Any.

Problemi correlati