给出一个多态特质像斯卡拉:没有使用多态类型的单实例
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,需要:变换[字符串]”。为了使用它,我必须明确地施放它:
... Identity.asInstanceOf[Transform[String]]
我不确定这是最好的,甚至是“正确的”方法。感谢您的任何建议。
所以铸造一个单独的对象是正确的方法。现在你的代码使用Identity [Any]而不是Identity [Nothing]。要么似乎工作,就演员而言,似乎这没关系。那么是否有任何错误?在lib中,Nil的类型为List [Nothing]。 –
'任何'在这里都是正确的选择。你期望有转换类型的值(即有'SingletonId.apply'将被应用到的东西),你不能说他们的类型是什么。另一方面,'Nil'中的'Nothing'正在捕捉一个事实,即没有任何值对应于空列表的头部。 –