Я пытаюсь использовать типы объектов case как абстрактные типы. Я был удивлен, увидев (аналогичный) код ниже компиляции:
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
}
}
В моем реальном примере Foo параметризируется и используется как класс case. Поэтому я не могу просто сделать A параметр типа.
Как f = BarTwo скомпилировать, когда A установлено как BarOne.type?
Если A в f: A интерпретируется как A <: Bar, почему это так?
Есть ли способ конкретно установить A для каждого экземпляра объекта Foo?
Я использую Scala 2.11.8.
Обновление: при замене val attributeType = ... на def attributeType = ... в FooOne и FooTwo сбой компиляции (как и ожидалось).