Zwykle podczas zbierania wszystkich elementów sekwencji pasujących do określonego typu kolekcja wynikowa ma zarówno typ oryginalna kolekcja i typ wybrany dla:Scala: Czy parametr type kolekcji przetrwa "zbieranie", gdy parametr type jest typem członka
trait Foo
trait Bar
trait Baz {
// Works
def def1(foo: Seq[Foo]): Seq[Foo with Bar] =
foo collect {case foobar: Bar => foobar}
}
ta działa nawet wtedy, gdy typ wejście jest parametryzowane przez ograniczonego typu członkowskim i wszystkim chcę z powrotem jest sekwencją parametryzowane przez typ oprawionego (nie typu member):
trait Baz {
type memberType <: Foo
// Works
def2(foo: Seq[memberType]): Seq[Foo with Bar] =
foo collect {case foobar: Bar => foobar}
}
Jednak ten fai ls gdy faktycznie chcę z powrotem sekwencję sparametryzować przez typ członkiem: Komunikat
trait Baz {
type memberType <: Foo
// Fails
def def3(foo: Seq[memberType]): Seq[memberType with Bar] =
foo collect {case foobar: Bar => foobar}
}
Błąd:
error: type mismatch;
found : Seq[this.Foo with this.Bar]
required: Seq[Baz.this.memberType with this.Bar]
foo collect {case foobar: Bar => foobar}
Aby odzyskać funkcjonalność, mogę to typ użytkownika w wywołaniu collect
, ale to wydaje się zbędny biorąc pod uwagę, że każdy element musi pasować do tego typu z powodu podpisu:
trait Baz {
type memberType <: Foo
// Works
def def4(foo: Seq[memberType]): Seq[memberType with Bar] =
foo collect {case foobar: memberType with Bar => foobar}
}
Czy istnieje sposób zdefiniowania sekwencji typów elementów, aby pamiętały typy ich członków, gdy wydano collect
?
Czy sprawdziłeś kod pod kątem ostrzeżeń? Ponieważ 'memberType' jest abstrakcyjne, jest usuwane w teście' foobar: memberType with Bar'. –
Jestem lekko zdezorientowany, dlaczego 1 i 2 działają nawet. Zebrana sekwencja to po prostu Seq [Bar], ale kompilator nadal pozwala na wpisanie jej jako Seq [Foo with Bar]. Okej, chyba jestem bardziej zdezorientowany, dlaczego nie spowoduje to ostrzeżenia o wymazaniu. – Kaito
Nie widzę ostrzeżeń po uruchomieniu żadnego z działających przykładów. Czy wpis wymazania ma jakikolwiek wpływ na ostatni przykład (który został zmodyfikowany w celu poprawnego wskazania, że "działa")? – drhagen