2013-09-23 2 views
5

У меня возникли проблемы с зависимым путем типами и сопоставлением с образцом:типа Избегайте залит член типа и суб-печатая

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]]) 

Конечно, должно быть чистым способом, чтобы избежать слепки?

+0

Я не уверен, но не является такой тип отбрасывает логику зависимых от пути типов? Тогда почему бы не использовать проекцию типа с ковариацией? – 4lex1v

+0

Я не могу использовать проекции, потому что основной тип элемента слишком общий. Это будет работать, только если я пройду через обруч «trait Foo [F <: Foo [F]] {type Bar; def defaultBar: F # Bar} ', которого я действительно хотел бы избежать. –

+0

Вы не нашли кода от пользователя 'Baz'? В этом примере выше вы никогда не определяете 'Baz' как тип для' Bar'. Ваш тест соответствует «Foo», но ваш код никогда не делает «Baz» действительным «Foo». – iain

ответ

0

Его невозможно сделать без использования проекций и ограничения типа, как defaultBar мы можем переопределить его неродственные типы

для например данных

trait MyFoo extends Foo { override def defaultBar: Int }