给定类型擦除,解决以下重载定义的最有效和最优雅的方法是什么:
trait Signal
trait Step[T] {
def ar(implicit ev: T <:< Boolean): Signal
def ar(implicit ev: T <:< Float ): Signal
}
不使用不同的名称Boolean和Float参数化?理想情况下是这样,T <:< Boolean union Float但那不存在......我可以不用额外的隐式间接来做吗?
给定类型擦除,解决以下重载定义的最有效和最优雅的方法是什么:
trait Signal
trait Step[T] {
def ar(implicit ev: T <:< Boolean): Signal
def ar(implicit ev: T <:< Float ): Signal
}
不使用不同的名称Boolean和Float参数化?理想情况下是这样,T <:< Boolean union Float但那不存在......我可以不用额外的隐式间接来做吗?
额外的间接是这样的:
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
}