2013-05-11 45 views
2

在下列情况下斯卡拉似乎不承认的system类型:如果我不能完全糊涂模式匹配拒绝承认成员类型(X值不_2的成员)

sealed trait Bar[S] { 
    def system: S 
} 

trait Foo { def bar(): Unit } 

trait FooBar extends Bar[Foo] 

,这意味着,我应该能够做到以下几点:

def test(fb: FooBar) { fb.system.bar() } // ok, this works 

但下列失败:

trait Test[S] { 
    val bar: Bar[S] 

    bar match { 
    case fb: FooBar => fb.system.bar() // error: value bar is not a member of _2 
    case _ => 
    } 
} 

这是一个模式匹配器中的错误,还是我错过了一个关键位?


编辑:请注意,下面的工作:

trait Test[S] { 
    val bar: Bar[S] 

    bar match { 
    case fb: FooBar => (fb: FooBar).system.bar() 
    case _ => 
    } 
} 

我想我应该提交一个bug?

回答

0

类型擦除是绝对涉及到这里,但我不是100%确定你所看到的是一个错误或预期的行为。由于您将bar val声明为Bar[S],因此S被清除,并且模式匹配器没有要使用的基础类型。你可以通过改变你的比赛看擦除警告:

case fb:Bar[Foo] => 

奇怪的是,如果你宣布barAny型原来的比赛将正常工作。另外,如果你在比赛的语句将鼠标悬停在fb,你可以看到它被视为:

Bar[S] with FooBar 

同样,我相信这一切又回到bar是如何被声明。不知道这是一个错误,但我想象一个在模式匹配器内部工作经验更丰富的人可能会有更深入的解释。

+0

'FooBar'是一个平面类型,所以擦除没有问题。另请注意,编译器接受我的类型注释'(fb:FooBar)',所以匹配大小写的类型肯定有些奇怪。 – 2013-05-11 22:16:28