模式匹配ClassTag或Manifest:Code Smell?

时间:2018-01-24 14:37:19

标签: scala scala-reflect

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

然后问题是:我们不应该期望编译器发出警告吗? 还是我错过了什么? (我认为答案是'你错过了什么')

0 个答案:

没有答案