我想知道使用在运行时通过 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 具有相同的行为,并且 TypeTag 无法拯救我,因为您无法在运行时根据 TYpeTag 检查实例。
那么问题是:我们不应该期望编译器抛出警告吗?还是我错过了什么?(我想答案是'你错过了一些东西')