2010-08-27 21 views
6
List(1,2) match { 
    case List(1,_) => println("1 in postion 1") 
    case _ => println("default") 
} 

compila/funciona bien. Lo mismo ocurre con lista de scala coincide con

List(1) match ... 
List(3,4,5) match ... 

pero no

List() match ... 

que se traduce en el siguiente error

found : Int(1) 
required : Nothing 
      case List(1,_) => println("1 in postion 1") 

¿Por qué la lista() Tratar de igualar la lista (1, _)?

Respuesta

6

Cuando escribe List(), el tipo inferido es Nothing, que es subtipo de todo.

Lo que está sucediendo es que Scala da un error cuando intenta coincidencias imposibles. Por ejemplo, "abc" match { case 1 => } dará como resultado un error similar. Del mismo modo, dado que List(1, _) se puede determinar estáticamente para que nunca coincida con List(), Scala da un error.

2

Tal vez porque ...

scala> implicitly[List[Nothing] <:< List[Int]] 
res3: <:<[List[Nothing],List[Int]] = <function1> 

scala> implicitly[List[Int] <:< List[Nothing]] 
<console>:6: error: could not find implicit value for parameter e:<:<[List[Int],List[Nothing]] 
     implicitly[List[Int] <:< List[Nothing]] 
+4

Lo que esto significa es que 'List [Int]' es coercible a 'List [Nothing]', pero al revés no es posible. – missingfaktor

12

List() tiene tipo List[Nothing]. Si usa List[Int](), funcionará como esperaba.

(En general, los tipos son tan restrictivas como pueden ser posiblemente;. Puesto que usted ha hecho una lista con nada en él, el tipo más restrictivo-posible Nothing se utiliza en lugar de Int como se pretendía)

Cuestiones relacionadas