Ich versuche, Fallobjekte Typen als abstrakte Typen zu verwenden. Ich war überrascht zu sehen (ähnlich) folgender Code kompiliert:Wie man abstrakten Typ mit gebundenem Typ konkret festlegt?
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
}
}
In meinem realen Beispiel Foo
parametrisiert und als Fall-Klasse verwendet. Also kann ich nicht einfach einen Typparameter A
machen. Wie wird f = BarTwo
kompiliert, wenn A
auf BarOne.type
eingestellt ist? Wenn die A
f: A
als A <: Bar
interpretiert wird, warum ist das so?
Gibt es eine Möglichkeit, A
für jede Objektinstanz von Foo
konkret festzulegen?
Ich benutze Scala 2.11.8.
Update: wenn ich val attributeType = ...
mit def attributeType = ...
in FooOne
& FooTwo
Zusammenstellung ersetzen nicht (wie erwartet).
Ist das fehlende 'erstreckt Foo' auf' FooOne' und 'FooTwo' einen Tippfehler? Weil es nicht kompiliert, wenn Sie das hinzufügen. –
@ EndeNeu Es war ein Versehen. Und du hast Recht, es kompiliert nicht (wie erwartet). Ich habe die Frage aktualisiert, damit sie so nah wie möglich am echten Code aussieht. Natürlich ist es nutzlos, da der obige Code nicht kompiliert und mein Code kompiliert wird. – muhuk
@muhuk Wenn der obige Code nicht kompiliert, dann stellt es nicht Ihren kompilierenden Code dar. Diese Frage ist nicht zu beantworten, es sei denn, Sie erhalten ein korrektes minimales Beispiel. – Daenyth