给定一个多态性状
trait Transform[T] { def apply( t: T ) : T }
可能想实现各种专门的实例,例如
case class Add[Double] extends Transform[Double] { def apply( t: Double ) ... }
case class Append[String] extends Transform[String] { def apply( t: String ) ... }
等等。现在经常需要的变换也是恒等变换。与其为每种类型 T 指定标识,不如对所有类型 T 仅使用一个单例实例似乎更可取。我的问题是:在 Scala 中实现此目的的最佳方法是什么?
这是我目前发现的:查看 List[T] 如何实现 List.empty[T] 和 Nil,我尝试使用 Nothing 作为 T 类型。这似乎是有道理的,因为 Nothing 是所有其他类型的子类型:
object Identity extends Transform[Nothing] {
def apply( t: Nothing ) = t
}
这似乎有效。但是,无论我想在哪里按原样使用这个实例,就像这里:
val array = Array[Transform[String]]( Transform.Identity )
我收到编译器错误“类型不匹配;找到:Identity.type,需要:Transform [String]”。为了使用它,我必须明确地转换它:
... Identity.asInstanceOf[Transform[String]]
我不确定这是最好的,甚至是“正确”的方法。感谢您的任何建议。