2011-12-20 13 views
9

Leggendo la Scala con l'esempio del libro e non v'è questo esempio quando Martin spiega digitare limiti a pagina 54:Scala per esempio - parametro del tipo di tratto con errore di contesto?

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

e

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

ulteriormente a pagina 55. Dice anche che il <:/<% è l'unica modifica richiesta per il tratto Set per dimostrare le possibilità di delimitazione del tipo.

Tuttavia, quando ripeto l'esempio con il mio codice, l'IDE si lamenta che i tratti NON possono avere limiti di visualizzazione, solo limiti di tipo. La modifica della parola chiave tratto in classe astratta o modifica della vista associata al tipo associato aiuta. È un errore nel libro?

+3

c'è stato un cambiamento nelle specifiche dopo che è stato scritto "Scala per esempio". Vedi [questa discussione] (http://scala-programming-language.1934581.n4.nabble.com/scala-view-bound-in-trait-td1991172.html) –

+0

Grazie per la segnalazione! Tuttavia penso che non sia positivo che la complessità di implementazione influenzi il linguaggio. Non vi è alcuna spiegazione logica del motivo per cui i tratti potrebbero non avere limiti superiori. – noncom

+3

I tratti possono avere limiti superiori. Non possono avere limiti di contesto e vista, perché questi sono parametri del costruttore e i tratti non possono avere parametri di costruzione. –

risposta

7

Usiamo il nostro potente strumento chiamato REPL per capire cosa sta succedendo:

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); 
} 

Come si può vedere, la vista legata diventa il secondo argomento del costruttore Example2. Dal momento che un tratto non ha un costruttore, chiaramente non è possibile fornire una vista vincolata.

Perchè questo e 'stato possibile nelle versioni precedenti è per me un mistero (forse un ulteriore Function1 val è stato creato all'interno del tratto e riempito dal compilatore?)

Per quanto riguarda le tue domande su Scala evoluzione, è maturo e potente. Puoi aspettarti dei cambiamenti tra le versioni principali (2.8, 2.9, 2.10) ma non considererei lo scala non abbastanza maturo per questo. Tuttavia, c'è sempre spazio per miglioramenti

Problemi correlati