給出一個多態特質像斯卡拉:沒有使用多態類型的單實例
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'正在捕捉一個事實,即沒有任何值對應於空列表的頭部。 –