2014-10-06 18 views
8

Supponiamo che io sono:Scala: utilizzando parametri di tipo o tipi astratti come tipo delimita

class Bounded[A] { 
    type apply[C <: A] = C 
} 

Questo compila:

implicitly[Bounded[Any]#apply[String] =:= String] 

Questo fallisce:

type Str = Bounded[Any]#apply[String] 

... con:

[error] /home/grant/Workspace/scunits/test/src/main/scala/Box.scala:37: type arguments[String] do not conform to type apply's type parameter bounds [C <: A] 
[error] type Str = Bounded[Any]#apply[String] 
[error]       ^

Ho provato a utilizzare i tipi astratti invece dei parametri di tipo, con lo stesso risultato. L'unica soluzione che ho trovato è stata quella di istanziare il tipo. Questo compila:

val boundedAny = new Bounded[Any] 
type Str2 = boundedAny.apply[String] 

Purtroppo sto lavorando con i tipi di fantasma che non hanno eseguito le istanze di tempo, spesso per motivi di prestazioni.

Perché Scala genera un errore di compilazione qui? C'è una soluzione migliore?

Grazie per qualsiasi aiuto.

Aggiornamento: Oltre alla seguente soluzione, avevo bisogno di un modo per sovrascrivere i tipi con i limiti del tipo astratto. Ho fatto questo in questo modo:

object Test { 
    class AbstractBounded[A] { 
    type apply[C <: A] <: A 
    class Workaround[C <: A] { 
     type go = apply[C] 
    } 
    } 
    class Bounded[A] extends AbstractBounded[A] { 
    type apply[C <: A] = C 
    } 

    type Str = Bounded[Any]#Workaround[String]#go 
} 

risposta

1

ne dite:

scala> class Bounded[A] { class i[C <: A]{ type apply = C}} 
defined class Bounded 

scala> type TTT = Bounded[Any]#i[String]#apply 
defined type alias TTT 

scala> implicitly[TTT =:= String] 
res4: =:=[TTT,String] = <function1> 

Scala dimenticato di ricercare generico (o un altro tipo "astratto") prima di parametri vincolanti di digitare alias. Dato che =: = funziona bene - sembra un bug per me. Forse impliciti si stanno risolvendo su un altro livello di compilazione o poco prima di questo controllo.

+0

Grazie, questo bug è stato fonte di molte frustrazioni per me. – Grant