考虑以下代码:
trait Trait {
  type X
  type Y[_ <: X]
} 
type T[X0,Y0[_ <: X0]] = Trait { type X = X0; type Y[S <: X0] = Y0[S] }
class TraitImpl extends Trait {
  override type X = Int
  override type Y[I <: Int] = List[I]
}
case class Wrap[X,Y[_ <: X]](t: T[X,Y])
val wrap = new Wrap[Int,List](new TraitImpl) // why explicitly write types?
为什么要显式编写类型,请参阅我的另一个问题。
现在我想进行模式匹配wrap:
wrap match {
  case w: Wrap[_,_]      => // error
  case w: Wrap[_,_[_]]   => // error
  case Wrap(t)           => // error
  case w: Wrap[Int,List] => // fine
}
我习惯于有多种模式匹配选择,尤其是最后两个case语句,有时是第一个语句。
但是前三个case都不起作用,为什么?(特别是case Wrap(t) =>)?