2010-07-31 9 views
5

Es necesario disponer de una colección de funciones genéricas, pero no puedo lograr que se haga de la manera que me gusta. creé unaScala: problemas utilizando funciones como objetos de primera clase

List[(Any)=>Unit] 

pero tan pronto como trato de insertar una función, por ejemplo, un

String=>Unit 

Me aparece un error. ¿Cómo podría declarar una colección de funciones genéricas que no considera los tipos de parámetros y valores devueltos?

Respuesta

9

Para finalizar la respuesta de @Moritz, debe elegir el tipo de argumento para T1 que es un subtipo del tipo de entrada de cada función en la lista. Nothing se ajusta a la ley: es un subtipo de todo tipo.

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

Un tipo existencial también funciona:

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

¿Cómo le llame a una función con la firma '(Nada) => Any'? –

+0

No puedes, sin un yeso. Pero la cuestión no pidió que – retronym

+0

:) ¿Hay una manera de conseguir de forma dinámica (Tal vez a través de la reflexión) el tipo real de la función, de modo que pueda realizar el reparto? – mariosangiorgio

11

Las funciones son contravariantes en los parámetros del tipo de intput, p. en su caso Function1[-T1,+R]. Esto significa que puede agregar una instancia de Any => Unit a List[String => Unit], pero no al revés. Esto, por supuesto, tiene sentido ya que no puede llamar a una función que espera un argumento de tipo String con un argumento de tipo Any.

Cuestiones relacionadas