4

我想知道使用在运行时通过 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 检查实例。

那么问题是:我们不应该期望编译器抛出警告吗?还是我错过了什么?(我想答案是'你错过了一些东西')

4

0 回答 0