2015-09-19 25 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 [中超]'。 –