在类型擦除下使用不同的证据参数进行重载

时间:2012-09-05 11:03:18

标签: scala overloading type-erasure

给定类型擦除,解决以下重载定义的最有效和最优雅的方法是什么:

trait Signal

trait Step[T] {
  def ar(implicit ev: T <:< Boolean): Signal
  def ar(implicit ev: T <:< Float  ): Signal
}

没有为BooleanFloat参数化使用不同的名称?理想情况下它会是T <:< Boolean union Float但是不存在......我可以不用额外的隐式间接吗?

1 个答案:

答案 0 :(得分:4)

额外的间接是这样的:

object Step {
  sealed trait SignalSource[T] { def toFloat(t: T): Float }
  implicit object BooleanSource extends SignalSource[Boolean] {
    def toFloat(t: Boolean) = if (t) 1f else 0f
  }
  implicit object FloatSource extends SignalSource[Float] {
    def toFloat(t: Float) = t
  }
}
trait Step[T] {
  def ar(implicit ev: Step.SignalSource[T]) : Signal
}