以前similar questionにさらにビットを拡張し、私は両方がPerson
を拡張昨日共通の特性を継承している具体的なオブジェクトのリストをマッピングするとき、具体的な暗黙的なものを選択できますか?
Employee
とManager
を掲載。私は両方のサブクラスの暗黙的な "converter"オブジェクトを定義しました。
具体的なクラスの1つを含むタイプList[Product with Serializable with Person]
のリストも作成しました。
$ scalac Example.scala && scala Example
Example.scala:21: error: could not find implicit value for parameter converter: Example.Converter[Product with Serializable with Example.Person]
List(Employee(3),Manager(4)) map(e => convert(e))
:Employee
とManager
別に正常に動作しますが、私はconvert
にリストをしようとすると、それはConverter
Person
のためを見つけることができないので、Scalaのコンパイラは文句をINGの
import scala.reflect.ClassTag
object Example {
trait Person { def age: Int }
case class Employee(age: Int) extends Person
case class Manager(age: Int) extends Person
class Converter[T] { def convert(t: T) = (t,t) }
def convert[T <: Person:ClassTag](p: T)(implicit converter: Converter[T]) =
converter.convert(p)
def main(args: Array[String]): Unit = {
implicit val employeeConverter = new Converter[Employee]()
implicit val managerConverter = new Converter[Manager]()
convert(Employee(1)) // Works
convert(Manager(2)) // Works
List(Employee(3),Manager(4)) map(e => convert(e)) // Compile error
}
}
convert
Person
のすべての具体的な実装に対して暗黙の変換を定義していることをScalaコンパイラに保証するにはどうすればよいですか?
あなたはきっと、暗黙的に選択するために、特定の静的な型を必要としています。それはHListのためのものではありませんか? –