使用隐式参数调用方法,其中类型仅在运行时已知

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)
}