2011-12-20 14 views
9

Lectura de la Scala por ejemplo el libro y no hay este ejemplo cuando Martin explica tipo límites en la página 54:Scala por ejemplo: parámetro de tipo de rasgo con error de límites de contexto?

trait Set[A <: Ordered[A]] { 
    def incl(x: A): Set[A] 
    def contains(x: A): Boolean 
} 

y

trait Set[A <% Ordered[A]] ... 

aún más en la página 55. También dice que la <:/<% es el único cambio requerido para Trait Set para demostrar las posibilidades de límite de tipo.

Sin embargo, cuando repito el ejemplo con mi propio código, el IDE se queja de que los rasgos pueden no tener límites vista, solamente el tipo límites. Cambiar la palabra clave de rasgo a clase abstracta o cambiar la vista vinculada para escribir ayuda vinculada. ¿Es esto un error en el libro?

+3

hubo un cambio en la especificación después de "Scala por ejemplo" fue escrito. Ver esta discusión [] (http://scala-programming-language.1934581.n4.nabble.com/scala-view-bound-in-trait-td1991172.html) –

+0

Gracias por señalar! Sin embargo, creo que no es bueno que la complejidad de la implementación influya en el lenguaje. No hay una explicación lógica de por qué los rasgos pueden no tener límites superiores. – noncom

+3

Los rasgos pueden tener límites superiores. No pueden tener límites de contexto y vista, porque estos son parámetros de constructor y los rasgos no pueden tener parámetros de constructor. –

Respuesta

7

Vamos a usar nuestra poderosa herramienta llamada REPL para entender lo que está pasando:

scala> trait Example[A<:Ordered[A]] { def contains(x:A):Boolean } 
defined trait Example 

scala> class Example2[A<%Ordered[A]](val a:A) { def isLower(otherA:A):Boolean = a< otherA } 
defined class Example2 

scala> :javap Example 
Compiled from "<console>" 
public interface Example{ 
    public abstract boolean contains(scala.math.Ordered); 
} 


scala> :javap Example2 
Compiled from "<console>" 
public class Example2 extends java.lang.Object implements scala.ScalaObject{ 
    public java.lang.Object a(); 
    public boolean isLower(java.lang.Object); 
    public Example2(java.lang.Object, scala.Function1); 
} 

Como se puede ver, la vista atado se convierte en el segundo argumento del constructor Ejemplo 2. Como un rasgo no tiene un constructor, claramente no es posible proporcionar una vista encuadernada.

Por qué esto ha sido posible en las versiones anteriores es para mí un misterio (tal vez una Función1 val adicional fue creado en el interior del rasgo y llenado por el compilador?)

En cuanto a su pregunta sobre la evolución Scala, es maduro y poderoso. Puede esperar cambios entre lanzamientos principales (2.8, 2.9, 2.10) pero no consideraría scala no lo suficientemente maduro para esto. Hay, sin embargo siempre hay espacio para la mejora

Cuestiones relacionadas