使用隐式参数调用方法,其中类型仅在运行时已知
Call method with implicit argument where type is only known at runtime
假设我有这样的方法:
def doSomething(a : A)(implicit someTrait : SomeTrait[A]) : B = { ... }
我调用一个 Java 方法返回 AnyRef
我想将返回的对象传递给 doSomething
:
val obj : AnyRef = javaObject.getRef
doSomething(obj)
我在运行时有足够的信息来为 AnyRef
对象获取更具体的类型 T
。我确信我在运行时找到的任何类型 T
都会有 SomeTrait[T]
。
如何在 AnyRef
上调用 doSomething
?我可以在运行时以某种方式查找 SomeTrait[T]
并显式传递它吗?
我不关心这是否会在运行时爆炸。
原则上不能。隐式解析发生在编译时。
如果你可以枚举超过SomeTrait
,你当然可以用模式匹配做一些事情,比如
trait SomeTrait[A]
implicit object SomeIntTrait extends SomeTrait[Int]
implicit object SomeStringTrait extends SomeTrait[String]
def doSomething[A: SomeTrait](a: A) = ???
def atRuntime(x: Any) = x match {
case i: Int => doSomething[Int](i)
case s: String => doSomething[String](s)
}
假设我有这样的方法:
def doSomething(a : A)(implicit someTrait : SomeTrait[A]) : B = { ... }
我调用一个 Java 方法返回 AnyRef
我想将返回的对象传递给 doSomething
:
val obj : AnyRef = javaObject.getRef
doSomething(obj)
我在运行时有足够的信息来为 AnyRef
对象获取更具体的类型 T
。我确信我在运行时找到的任何类型 T
都会有 SomeTrait[T]
。
如何在 AnyRef
上调用 doSomething
?我可以在运行时以某种方式查找 SomeTrait[T]
并显式传递它吗?
我不关心这是否会在运行时爆炸。
原则上不能。隐式解析发生在编译时。
如果你可以枚举超过SomeTrait
,你当然可以用模式匹配做一些事情,比如
trait SomeTrait[A]
implicit object SomeIntTrait extends SomeTrait[Int]
implicit object SomeStringTrait extends SomeTrait[String]
def doSomething[A: SomeTrait](a: A) = ???
def atRuntime(x: Any) = x match {
case i: Int => doSomething[Int](i)
case s: String => doSomething[String](s)
}