2016-08-03 26 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'代表的类。什么是正确的将取决于您使用此代码的上下文。 –