Учитывая полиморфную черту, такую как
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, required: Transform [String]".Чтобы использовать его, я должен явным образом разыграть его:
... Identity.asInstanceOf[Transform[String]]
Я не уверен, что это лучший или даже «правильный» способ сделать это.Спасибо за любой совет.