Подтвердить что ты не робот

Неожиданное поведение

Учитывая простой тип алгебраических данных Parent:

scala> sealed trait Parent
defined trait Parent

scala> case object Boy extends Parent
defined object Boy

scala> case object Girl extends Parent
defined object Girl

Я определил признак:

scala> trait HasGirl { 
     |   val x: Girl.type
     | }
defined trait HasGirl

Затем я создал класс case, который реализовал HasGirl, но при условии x значения Boy.type.

scala> case class Thing(x: Boy.type) extends HasGirl
defined class Thing

Я ожидал ошибку времени компиляции, так как не вижу, как x типа Boy.type соответствует val x: Girl.type.

Что здесь происходит?

4b9b3361

Ответ 1

Кажется, что одноэлементные типы без членов эквивалентны как-то здесь. Возможно, это ошибка (вы подали билет). Например, следующее создает ошибку времени выполнения:

sealed trait Parent
case object Boy  extends Parent
case object Girl extends Parent

trait HasGirl {
  val x: Girl.type
}

case class Thing(x: Boy.type) extends HasGirl {
  def y: Girl.type = (this: HasGirl).x
}


val t = Thing(Boy)
t.y   // ClassCastException !

Если я добавлю элемент, вы получите ошибку времени компиляции:

sealed trait Parent
case object Boy  extends Parent
case object Girl extends Parent { def hello = 1234 }

trait HasGirl {
  val x: Girl.type
}

case class Thing(x: Boy.type) extends HasGirl
<console>:57: error: overriding value x in trait HasGirl of type Girl.type;
 value x has incompatible type
       case class Thing(x: Boy.type) extends HasGirl
                        ^