Scala 模式匹配时的虚线类型失败

Scala 模式匹配时的虚线类型失败,scala,code-generation,pattern-matching,Scala,Code Generation,Pattern Matching,我已经看到这些情况很好地工作(注意scala.Int而不是Int): 但在以下示例中,使用整个路径失败: def f[T: TypeTag](l: List[T]): Int = { l match { case li: List[scala.Int] if typeOf[T] <:< typeOf[scala.Int] => li(0) case _ => 0 } } def[T:TypeTag](l:List[T]):Int={ 我匹配{ 案

我已经看到这些情况很好地工作(注意scala.Int而不是Int):

但在以下示例中,使用整个路径失败:

def f[T: TypeTag](l: List[T]): Int = {
  l match {
    case li: List[scala.Int] if typeOf[T] <:< typeOf[scala.Int] => li(0)
    case _ => 0
  }
}
def[T:TypeTag](l:List[T]):Int={
我匹配{
案例li:List[scala.Int]如果类型为[T]li(0)
大小写=>0
}
}

在保持scala.Int不变的情况下,是否有可能避免这种情况?问题是我需要自动生成这段代码,并且我希望避免使用导入重新定义。

这段代码无论如何都不会工作,因为您无法匹配泛型,因为类型擦除。程序在运行时没有关于
列表类型的信息。是的,你完全正确(这可以用TypeTags解决)。但是考虑一下下面的函数:
def[C[\u]](l:C[Int]):Int=l match{case l:List[\u]=>l(0)}
如果我这样做,它不会编译。它需要List[Int]而不是List[\u1]。RHS中的asInstanceOf非常难看。当然它不会编译,因为它不正确。但在泛型上进行匹配更糟糕,因为它不会在编译时崩溃,而是在运行时崩溃。。。我只想举个简单的例子。无论如何,我已经用真正的代码更新了它。是否可以保留li:List[scala.Int]符号(因为li:List[Int]可以编译)?
def f[T: TypeTag](l: List[T]): Int = {
  l match {
    case li: List[scala.Int] if typeOf[T] <:< typeOf[scala.Int] => li(0)
    case _ => 0
  }
}