通过 class 名称获取隐式实例
Get an implicit instance by class name
我想做的是:从 class 名称中获取一个隐式实例。
我无法获得在运行时创建的 class 类型的隐式实例的主要问题。
我有:
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
}
我想做的:以某种方式从 class 名称中获取隐式实例。
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))
错误:找不到参数 worker 的隐式值:Worker[typeHolder.Typed]
val worker = getWorker(getClassType(className))
那是不可能的。
隐式解析在编译时解析:它不受运行时值的影响。
我想做的是:从 class 名称中获取一个隐式实例。 我无法获得在运行时创建的 class 类型的隐式实例的主要问题。
我有:
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
}
我想做的:以某种方式从 class 名称中获取隐式实例。
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))
错误:找不到参数 worker 的隐式值:Worker[typeHolder.Typed] val worker = getWorker(getClassType(className))
那是不可能的。
隐式解析在编译时解析:它不受运行时值的影响。