Scala 当为具有已擦除参数的类型合成ClassTag时,如何取消隐藏未选中的警告?

Scala 当为具有已擦除参数的类型合成ClassTag时,如何取消隐藏未选中的警告?,scala,pattern-matching,type-erasure,Scala,Pattern Matching,Type Erasure,类型参数T上的模式匹配会引发未检查的警告 scala> def f[T](v: List[Any]): List[T] = v.collect { case x: T => x } ^ warning: abstract type pattern T is unchecked since it is eliminated by erasure def

类型参数
T
上的模式匹配会引发未检查的警告

scala> def f[T](v: List[Any]): List[T] = v.collect { case x: T => x }
                                                             ^
       warning: abstract type pattern T is unchecked since it is eliminated by erasure
def f[T](v: List[Any]): List[T]
哪一个可以尝试使用
ClassTag

scala> def f[T: scala.reflect.ClassTag](v: List[Any]): List[T] = v.collect { case x: T => x }
def f[T](v: List[Any])(implicit evidence$1: scala.reflect.ClassTag[T]): List[T]
它解决了简单的基于类的类型的警告

scala> f[String](List(42, "a"))
val res7: List[String] = List(a)
但是,现在,即使对于具有参数化类型且在运行时已擦除组件的类型,未选中的警告也会隐藏

f[List[String]](List(List(42)))
val res9: List[List[String]] = List(List(42)) // oops!
在后一种情况下,我们如何继续发出未经检查的警告?

Scala 3
ClassTag
with
TypeTest
,或其缩写
Typeable
,当我们尝试检查一个类型的多个类组件时,它会发出警告

scala> def f[T: scala.reflect.Typeable](v: List[Any]): List[T] = v.collect { case x: T => x }
def f[T](v: List[Any])(implicit evidence$1: scala.reflect.Typeable[T]): List[T]

scala> f[String](List(42, "a"))
val res0: List[String] = List(a)

scala> f[List[String]](List(List(42)))
1 |f[List[String]](List(List(42)))
  |                               ^
  |               the type test for List[String] cannot be checked at runtime
val res1: List[List[String]] = List(List(42))
正如所说的那样

TypeTag
不再存在

ClassTag.unapply
用于类型测试是不合理的,不应使用

我们现在有了
TypeTest