2010-11-15 6 views
7

9 de cada 10 veces, el simple uso de Map y Set se comportan como espero que lo haría, pero de vez en cuando estoy inesperadamente golpeado con¿Por qué Map y Set tienen alias en scala.Predef?

error: type mismatch; 
[INFO] found : scala.collection.Set[String] 
[INFO] required: Set[String] 

A modo de ejemplo, a partir de la réplica:

scala> case class Calculator[+T](name: String, parameters: Set[String]) 
defined class Calculator 

scala> val binding=Map.empty[String, String] 
binding: scala.collection.immutable.Map[String,String] = Map() 

scala> Calculator("Hello",binding.keySet) 
<console>:9: error: type mismatch; 
found : scala.collection.Set[String] 
required: Set[String] 
     Calculator("Hello",binding.keySet) 
           ^

I Creo que entiendo el error, es decir, la llamada de función en los tipos con alias devuelve los tipos reales.

Y así me parece que la solución es importar los tipos sin alias. Sobre el cual cada otro archivo en mi proyecto ahora generará errores de desajuste de tipo, por lo que tendré que importarlo en cada archivo. Lo que lleva a la pregunta que hago en el título: ¿cuál fue el propósito del alias en Predef, si finalmente necesito importar el paquete real?

¿Está mi entendimiento defectuoso, o mi caso de uso no es el típico, o ambos?

Respuesta

11

Ha diagnosticado mal el problema. No es que no reconozca que el tipo alias es del mismo tipo que el aliasing. Es que el alias tipo es scala.collection.immutable.Set y eso no es lo mismo que scala.collection.Set.

Editar: por cierto, pensé que había arreglado esto, como lo demuestra el comentario de los diagnósticos del tipo:

... Also, if the 
* type error is because of a conflict between two identically named 
* classes and one is in package scala, fully qualify the name so one 
* need not deduce why "java.util.Iterator" and "Iterator" don't match. 

necesita parecer más trabajo.

Editar 17/7/2010: OK, me tomó un tiempo sorprendentemente largo, pero ahora al menos dice algo difícil de entender.

files/neg/type-diagnostics.scala:4: error: type mismatch; 
found : scala.collection.Set[String] 
required: scala.collection.immutable.Set[String] 
    def f = Calculator("Hello",binding.keySet) 
            ^
+0

Gracias - Eso tiene sentido ahora que lo miro. Pero supongo que mi pregunta se convierte en '¿Cómo puedo hacer que este código haga lo que quiero con mínimo cruxt?' Si necesito convertir/convertir de un tipo a otro, así como usar nombres completamente calificados para un caso de uso tan simple como el anterior, supongo que debo hacerlo mal. – Jim

+0

Siempre puede llamar a .toSet en cualquier colección para obtener un conjunto inmutable. Puedes o no estar haciendo algo mal: esto es más que nada lo que sucede cuando prefieres la inmutabilidad, pero el mundo entero (incluido tu propio mundo) no te da cosas inmutables. – extempore

+0

por qué inmutable.Map # keySet no devuelve un juego inmutable.Set? – gerferra

2

El verdadero problema es que scala.collection.immutable.Map#keySet devuelve un scala.collection.Set (de sólo lectura Set) en lugar de un scala.collection.immutable.Set (un inmutable Set). Lo dejo para otra persona para explicar por qué es así ...

Editar

alguien pide una explicación para el tipo de retorno de Map#keySet en this thread, pero no recibe una respuesta.

+3

Lo arreglaré. http://lampsvn.epfl.ch/trac/scala/ticket/4001 – extempore

Cuestiones relacionadas