Normalmente, quando raccolgono tutti gli elementi di una sequenza che corrispondono a un particolare tipo, la raccolta risultante ha sia il tipo di collezione originale e il tipo selezionato per:Scala: il parametro type di una raccolta sopravvive a "collect" quando il parametro type è un tipo di membro
trait Foo
trait Bar
trait Baz {
// Works
def def1(foo: Seq[Foo]): Seq[Foo with Bar] =
foo collect {case foobar: Bar => foobar}
}
funziona Ciò anche quando il tipo l'ingresso è parametrizzato da un tipo di elemento limitato e tutto quello che voglio indietro è una sequenza parametrizzato in base al tipo legato (non il tipo membro):
trait Baz {
type memberType <: Foo
// Works
def2(foo: Seq[memberType]): Seq[Foo with Bar] =
foo collect {case foobar: Bar => foobar}
}
Tuttavia, questo fai ls quando ho voglia di nuovo una sequenza parametrizzato in base al tipo membro: messaggio
trait Baz {
type memberType <: Foo
// Fails
def def3(foo: Seq[memberType]): Seq[memberType with Bar] =
foo collect {case foobar: Bar => foobar}
}
Errore:
error: type mismatch;
found : Seq[this.Foo with this.Bar]
required: Seq[Baz.this.memberType with this.Bar]
foo collect {case foobar: Bar => foobar}
di recupero della funzionalità, che possono includere il tipo di membro nella chiamata collect
, ma che sembra ridondante dato che ogni elemento deve corrispondere quel tipo a causa della firma:
trait Baz {
type memberType <: Foo
// Works
def def4(foo: Seq[memberType]): Seq[memberType with Bar] =
foo collect {case foobar: memberType with Bar => foobar}
}
c'è un modo per definire una serie di tipi di membri in modo che si ricordano il loro tipo di membro quando collect
ed?
Hai controllato quel codice per gli avvisi? Poiché 'memberType' è astratto, viene cancellato nel controllo' foobar: memberType con Bar'. –
Sono un po 'confuso perché anche 1 e 2 funzionano. La sequenza raccolta è solo una Seq [Bar], ma il compilatore consente comunque di essere digitato come Seq [Foo con Bar]. Ok, credo di essere più confuso perché questo non si traduce in un avviso di cancellazione. – Kaito
Non vedo alcun avviso quando eseguo uno degli esempi di lavoro. La cancellazione di tipo avrebbe avuto qualche effetto sull'ultimo esempio (che è stato modificato per indicare correttamente che "Funziona")? – drhagen