У меня возникли проблемы с зависимым путем типами и сопоставлением с образцом:типа Избегайте залит член типа и суб-печатая
trait View[A]
trait Foo {
type Bar
def defaultBar: Bar
}
trait Baz extends Foo {
def view(init: Bar): View[Bar]
}
trait Test {
val foo: Foo
def bar: foo.Bar = foo.defaultBar
def test(): Option[View[foo.Bar]] =
foo match {
case b: Baz => Some(b.view(bar))
case _ => None
}
}
Это терпит неудачу, потому что scalac не идентифицирует foo
с b
. В результате, он работает только с двумя слепками:
case b: Baz => Some(b.view(bar.asInstanceOf[b.Bar]).asInstanceOf[View[foo.Bar]])
Конечно, должно быть чистым способом, чтобы избежать слепки?
Я не уверен, но не является такой тип отбрасывает логику зависимых от пути типов? Тогда почему бы не использовать проекцию типа с ковариацией? – 4lex1v
Я не могу использовать проекции, потому что основной тип элемента слишком общий. Это будет работать, только если я пройду через обруч «trait Foo [F <: Foo [F]] {type Bar; def defaultBar: F # Bar} ', которого я действительно хотел бы избежать. –
Вы не нашли кода от пользователя 'Baz'? В этом примере выше вы никогда не определяете 'Baz' как тип для' Bar'. Ваш тест соответствует «Foo», но ваш код никогда не делает «Baz» действительным «Foo». – iain