我想知道在运行时通过ClassTag或Manifest使用泛型类型是否实际上不是代码气味,导致不可预测的结果。
以下是可能发生的事情的一个例子:
import scala.reflect._
trait BaseTrait
trait OtherTrait
def filter[T](any: AnyRef)(implicit ct: ClassTag[T]): Option[T] =
any match {
case t: T => Option(t)
case _ => None
}
val baseOnly: BaseTrait = new BaseTrait {}
// None expected, None found
println(filter[OtherTrait](baseOnly))
// None expected, Some(baseOnly) found
println(filter[BaseTrait with OtherTrait](baseOnly))
我确实理解为什么(当提供BaseTrait与OtherTrait时,Classtag仅捕获BaseTrait)。 我也明白Manifest具有相同的行为,并且TypeTags无法保存我,因为您无法在运行时针对TYpeTag检查实例。
然后问题是:我们不应该期望编译器发出警告吗? 还是我错过了什么? (我认为答案是'你错过了什么')