私は、ケースオブジェクトの型を抽象型として使用しようとしています。私が見てびっくりしました(同様の)以下のコードはコンパイルされます:私の本当の例Foo
でタイプバインドで抽象タイプを具体的に設定する方法は?
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
}
}
はパラメータ化し、ケースクラスとして使用されます。ですから、私はA
を型パラメータにすることはできません。
A
をBarOne.type
に設定すると、f = BarTwo
はどのようにコンパイルされますか?
A
がf: A
の場合、それはA <: Bar
と解釈されます。なぜそうですか?
のオブジェクトインスタンスごとにA
を具体的に設定する方法はありますか?
私はScala 2.11.8を使用しています。
アップデート:私はFooOne
& FooTwo
にdef attributeType = ...
でval attributeType = ...
を交換する際に、コンパイルが失敗した(予想通り)。
は '' FooOne'と 'FooTwo'タイプミスにFoo'を拡張欠如していますか?それを追加するとコンパイルされないためです。 –
@EndeNeuそれは監視だった。そして、あなたは正しいです、それは(期待通りに)コンパイルされません。実際のコードに可能な限り近いように質問を更新しました。もちろん、上のコードはコンパイルされず、コードがコンパイルされるので、無駄です。 – muhuk
@muhuk上記のコードがコンパイルされていない場合は、コンパイルコードを表していません。あなたが正しい最小限の例を得ない限り、この質問は答えることができません。 – Daenyth