2016-08-03 25 views
1

我有類:在運行時斯卡拉通過式類與泛型

class MyClass[T <: AnyRef : Manifest](implicit classTagT: ClassTag[T]) { 
... 
} 

我有變量:

val t: Type = typeOf[...] 

我如何能做到這一點:

val c = new MyClass[t] 
+0

對不起,scala.reflect.api.Type – Antipich

+1

您可以編輯它,而不是道歉 –

+0

我想你的意思'scala.reflect.runtime.universe.Type'。你真的需要獲得'Type'運行時變量嗎?如果你可以做'typeOf [A]',你也可以簡單地執行'new MyClass [A]'。中間是否有一層阻止你這樣做? – stefanobaghino

回答

0

第一,Manifest延伸ClassTag,所以聲明看起來可疑。您可能想要刪除一個或另一個(如果可能,更好Manifest)。

其次,你不能做到你想要的。但是你可以從Type構造ClassTagManifest並手動傳遞(如@stefanobaghino指出,如果從typeOf[...]得到t,這應該是不必要的)。約(未經測試):

val t: Type = ... 
val clazz = scala.reflect.runtime.currentMirror.runtimeClass(t) 
ManifestFactory.classType(clazz) match { 
    case m: Manifest[a] => 
    val c = new MyClass(m, m) 
} 
+0

謝謝。 新問題:) 錯誤:(138,32)類型不匹配; found:scala.reflect.Manifest [Nothing] required:Manifest [T] 注意:Nothing <:T,但特性Manifest在類型T中是不變的。 您可能希望研究通配符類型,例如'_ <: T'。 (SLS 3.2.10) new CaseClassBuilder()(m) ^ – Antipich

+0

我修正了它 val c = new MyClass(m.asInstanceOf [Manifest [cls.type]]) 是否正常? – Antipich

+0

編譯並可能工作,因爲泛型參數在運行時不會影響任何東西(但可能會導致在編譯時選擇不同的含義),但沒有任何意義:'cls.type'是隻有實例是對象'cls',而不是'cls'代表的類。什麼是正確的將取決於您使用此代碼的上下文。 –