我有類:在運行時斯卡拉通過式類與泛型
class MyClass[T <: AnyRef : Manifest](implicit classTagT: ClassTag[T]) {
...
}
我有變量:
val t: Type = typeOf[...]
我如何能做到這一點:
val c = new MyClass[t]
我有類:在運行時斯卡拉通過式類與泛型
class MyClass[T <: AnyRef : Manifest](implicit classTagT: ClassTag[T]) {
...
}
我有變量:
val t: Type = typeOf[...]
我如何能做到這一點:
val c = new MyClass[t]
第一,Manifest
延伸ClassTag
,所以聲明看起來可疑。您可能想要刪除一個或另一個(如果可能,更好Manifest
)。
其次,你不能做到你想要的。但是你可以從Type
構造ClassTag
或Manifest
並手動傳遞(如@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)
}
謝謝。 新問題:) 錯誤:(138,32)類型不匹配; found:scala.reflect.Manifest [Nothing] required:Manifest [T] 注意:Nothing <:T,但特性Manifest在類型T中是不變的。 您可能希望研究通配符類型,例如'_ <: T'。 (SLS 3.2.10) new CaseClassBuilder()(m) ^ – Antipich
我修正了它 val c = new MyClass(m.asInstanceOf [Manifest [cls.type]]) 是否正常? – Antipich
編譯並可能工作,因爲泛型參數在運行時不會影響任何東西(但可能會導致在編譯時選擇不同的含義),但沒有任何意義:'cls.type'是隻有實例是對象'cls',而不是'cls'代表的類。什麼是正確的將取決於您使用此代碼的上下文。 –
對不起,scala.reflect.api.Type – Antipich
您可以編輯它,而不是道歉 –
我想你的意思'scala.reflect.runtime.universe.Type'。你真的需要獲得'Type'運行時變量嗎?如果你可以做'typeOf [A]',你也可以簡單地執行'new MyClass [A]'。中間是否有一層阻止你這樣做? – stefanobaghino