Коллекция структурных параметров типа странности

Это кажется простой вещью, но я не могу этого понять...

Это компилирует:

object CanFoo1 {
  def foo(): Unit = {
    println("Yup, I can foo alright")
  }
}

object CanFoo2 {
  def foo(): Unit = {
    println("And I can foo with the best")
  }
}

trait A {
  type CanFoo = { def foo(): Unit }
  def fooers: Seq[CanFoo]
}

class B extends A {
  def fooers = Seq(
    // CanFoo1, // <- won't compile when this is uncommented
    CanFoo2
  )
}

Но раскомментируя // CanFoo1, строка дает:

error: type mismatch;
found   : Seq[Object]
required: Seq[B.this.CanFoo]
   (which expands to)  Seq[AnyRef{def foo(): Unit}]
def fooers = Seq(
              ^
one error found

Таким образом, кажется, что компилятор понимает, что коллекция, содержащая только один элемент Seq(CanFoo2) (или же Seq(CanFoo1)) имеет правильный тип, но когда оба объекта находятся в коллекции, он сдается? Что я здесь не так делаю?

1 ответ

Решение

Таким образом, кажется, что компилятор понимает, что коллекция, содержащая только один элемент Seq(CanFoo2) (или же Seq(CanFoo1)) имеет правильный тип, но когда оба объекта находятся в коллекции, он сдается? Что я здесь не так делаю?

Когда вы проходите CanFoo1 или же CanFoo2 к Seq применить, последовательность выводится как тип CanFoo1.type или же CanFoo2.type соответственно, это не означает, что CanFoo,

Когда вы передаете оба элемента в Seqкомпилятор пытается найти общий тип, к которому он может правильно обратиться, чтобы компилировать код, и единственный тип, который он может найти, это Object, но fooers называется типом Seq[CanFoo]так что компилятор кричит.

Вы можете немного помочь компилятору, явно написав тип коллекции:

class B extends A {
  def fooers = Seq[CanFoo](
    CanFoo1,
    CanFoo2
  )
}
Другие вопросы по тегам