Я пытаюсь использовать типы объектов 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
сбой компиляции (как и ожидалось).