断言通过运行时反射恢复的 class 是另一个 class 的子class

Assert that class recovered through runtime reflection is a subclass of another class

我正在尝试调用一个方法:

def doSomething[A <: Super : ClassTag] : B = { ... }

该方法只接受一个类型参数。

我有一个 AnyRef 对象,我已经在运行时恢复了它的 class。我知道对象的 class 是 Super 的子 class 并且我想调用 doSomething.

有没有办法以对象的class为参数调用doSomething?我可以向编译器断言我在运行时恢复的 class 是 Super 的子 class 吗?

如果我的对象出于某种原因不是 Super 的子class,我不担心运行时的这种失败。

我希望这应该有效:

val obj: AnyRef = ...
val tag = ClassTag(obj.getClass).asInstanceOf[ClassTag[_ <: Super]]
doSomething(tag)

如果没有,你可以更骗编译器:

val tag = ClassTag(obj.getClass).asInstanceOf[ClassTag[Super]]

(因为转换实际上是空操作,即使编译器现在认为 tagClassTag[Super] 并将推断 Super 类型参数为 doSomething, 它会在运行时得到正确的 class。)