2017-09-15 3 views
0

Ce que j'essaie de faire est: obtenir une instance implicite du nom de la classe. Le principal problème que je ne peux pas obtenir une instance implicite pour un type de classe créé lors de l'exécution.Obtenir une instance implicite par nom de classe

Ce que j'ai:

trait Base 
case class A() extends Base 
case class B() extends Base 

trait Worker[T <: Base] { 
    def foo(t: T): Unit 
} 

implicit val workerA = new Worker[A] { 
    def foo(a: A): Unit = ??? // do some A specific work 
} 

implicit val workerB = new Worker[B] { 
    def foo(b: B): Unit = ??? // do some B specific work 
} 

Ce que je veux faire: obtenir en quelque sorte une instance implicite du nom de la classe.

trait TypeHolder { 
    type Typed <: Base 
    } 


    def getClassType(className: String): TypeHolder = className match { 
    case "A" => new TypeHolder { 
     type Typed = A 
    } 
    case "B" => new TypeHolder { 
     type Typed = B 
    } 
    } 

    def getWorker(typeHolder: TypeHolder)(implicit worker: Worker[typeHolder.Typed]): Worker[typeHolder.Typed] = worker 

    val className: String = ConfigFactory.load().getString("class-name") 
    val worker = getWorker(getClassType(className)) 

Erreur: n'a pas pu trouver la valeur implicite pour les travailleurs des paramètres: travailleur [typeHolder.Typed] travailleur val = getWorker (getClassType (className))

Répondre

3

C'est impossible.

La résolution implicite est résolue au moment de la compilation: elle ne peut pas être influencée par une valeur d'exécution.