Dies scheint eine einfache Sache, aber ich kann es nicht verstehen ...Sammlung Strukturtyp Parameter Seltsamkeit
Dies kompiliert:
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
)
}
Aber uncommenting die // CanFoo1,
Linie gibt:
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
So scheint es, dass der Compiler versteht, dass eine Sammlung mit nur einem Element Seq(CanFoo2)
(oder Seq(CanFoo1)
) vom richtigen Typ ist, aber wenn beide Objekte in der Sammlung sind, gibt es auf? Was mache ich hier falsch?
Danke für die schnelle und informative Antwort. Ich glaube, ich verstehe jetzt - ohne einen expliziten Typparameter wird der Collection-Typ aus den Elementen abgeleitet, und dann wird dieser abgeleitete Typ auf die Konformation zum Strukturtyp überprüft. Der Typinferenzierer enthält den deklarierten Strukturtyp nicht in den Dingen, die er beim Ableiten des Typs von Seq kennt. – delocalizer