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
}
Grazie, questo bug è stato fonte di molte frustrazioni per me. – Grant