Sto tentando di utilizzare i tipi di oggetti caso come tipi astratti. Sono rimasto sorpreso di vedere (simile) codice qui sotto compila:Come impostare concretamente il tipo astratto con il tipo bound?
sealed abstract class Bar
case object BarOne extends Bar
case object BarTwo extends Bar
sealed abstract class Foo {
type A <: Bar
def f: A
}
object Foo {
object FooOne extends Foo {
type A = BarOne.type
val f = BarTwo
}
object FooTwo extends Foo {
type A = BarTwo.type
val f = BarOne
}
}
Nel mio esempio reale Foo
viene parametrizzata e usato come una classe case. Quindi non posso semplicemente creare un parametro di tipo A
.
Come viene compilato f = BarTwo
, quando A
è impostato su BarOne.type
?
Se A
in f: A
viene interpretato come A <: Bar
, perché è così?
C'è un modo per impostare in modo concreto A
per ciascuna istanza di oggetto di ?
Sto utilizzando Scala 2.11.8.
Aggiornamento: quando sostituisco val attributeType = ...
con def attributeType = ...
in FooOne
& FooTwo
compilazione fallisce (come previsto).
è mancante 'estende foo' su' 'FooOne' e FooTwo' un errore di battitura? Perché non si compila se lo aggiungi. –
@EndeNeu Era una svista. E hai ragione, non si compila (come previsto). Ho aggiornato la domanda per renderla il più simile possibile al codice reale. Ovviamente è inutile poiché il codice sopra non viene compilato e il mio codice viene compilato. – muhuk
@muhuk se il codice sopra non viene compilato, non rappresenta il codice di compilazione. Questa domanda non risponde se non si ottiene un esempio minimo corretto. – Daenyth