2015-09-19 73 views
0

我试图调用一个方法的一个子类:断言类通过运行时反射恢复另一类

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

的方法只需要一个类型参数。

我有一个AnyRef对象,我在运行时恢复了它的类。我知道该对象的类是Super的子类,我想调用doSomething

有没有办法以对象的类作为参数调用doSomething?我可以向编译器声明,我在运行时恢复的类是Super的子类吗?

由于某种原因,我的对象不是Super的子类,因此在运行时我不担心这种失败。

回答

1

我期望这应该工作:

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,它将在运行时得到正确的类。)

+0

这两个选项都有效为我而战。 – mushroom

+1

在这种情况下,我更喜欢第一个,因为'tag'实际上是'ClassTag [_ <:Super]'的一个实例(假设“我在运行时恢复的类是Super的子类”), ClassTag [中超]'。 –