2016-07-15 3 views
2

以前similar questionにさらにビットを拡張し、私は両方がPersonを拡張昨日共通の特性を継承している具体的なオブジェクトのリストをマッピングするとき、具体的な暗黙的なものを選択できますか?

EmployeeManagerを掲載。私は両方のサブクラスの暗黙的な "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)) 

EmployeeManager別に正常に動作しますが、私はconvertにリストをしようとすると、それはConverterPersonのためを見つけることができないので、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 
    } 
} 

convertPersonのすべての具体的な実装に対して暗黙の変換を定義していることをScalaコンパイラに保証するにはどうすればよいですか?

+2

あなたはきっと、暗黙的に選択するために、特定の静的な型を必要としています。それはHListのためのものではありませんか? –

答えて

-1

いいえ、できません。 Scalaのドキュメントを見てくださいhttp://scala-lang.org/files/archive/spec/2.11/07-implicits.html

しかし、クラス階層/継承によって引き起こされる暗黙的な記述と競合する場合は、最も具体的なものが選択されます。したがって、Managerが従業員から継承した場合、それはうまく解決するはずです。ここ

同様のポストは、What are scala's rules for resolving conflicting implicit values

関連する問題