Коллекция структурных параметров типа странности
Это кажется простой вещью, но я не могу этого понять...
Это компилирует:
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
)
}