我有类:在运行时斯卡拉通过式类与泛型
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