在Scala中,我是否可以动态指定参数化类型的类型参数?

在Scala中,我是否可以动态指定参数化类型的类型参数?,scala,types,parametric-polymorphism,Scala,Types,Parametric Polymorphism,我正在编写一个程序,其中用户在命令行上指定类的路径。我通过以下方式将其转换为类对象: val clazz = Class.forName(args([0])) 我有一个参数类MyParametric[T],只有一个类型参数。然后,我想创建另一个ClasstypeClass[ParamatricType[clazz],这样我就可以将其传递给一个方法,例如,我想执行以下操作 myMethod(classOf[ParametricType[clazz]]) 但这是不允许的。如何在动态给定类型参数的

我正在编写一个程序,其中用户在命令行上指定类的路径。我通过以下方式将其转换为
对象:

val clazz = Class.forName(args([0]))
我有一个参数类
MyParametric[T]
,只有一个类型参数。然后,我想创建另一个
Class
type
Class[ParamatricType[clazz]
,这样我就可以将其传递给一个方法,例如,我想执行以下操作

myMethod(classOf[ParametricType[clazz]])

但这是不允许的。如何在动态给定类型参数的情况下实例化参数化类型?

如果要将其用作
classOf
的参数,您甚至不需要类型参数。您只需使用
\uu
,因为类型参数在Scala中的运行时会被擦除:

myMethod(classOf[ParametricType[_]])

ParametricType
的类型参数将被删除,因此无论您为
\u
插入什么(包括
\u
)插入什么,
classOf[ParametricType[\u]]
的值都将相同


类型与未擦除的类型不同(编译器在编译时跟踪).您可以参考singleton类型
clazz.type
,但不清楚这会为您带来什么。

从您提供的信息中,很难判断用户是否会从已知类(例如水果)集合中指定或者任何可以想象的类。但是,你可以在作业过程中使用不同类的模式匹配,并根据类型进行处理。

如果你需要做的事情比
类的
(其他答案已经处理过)多,并且可以修改
参数类型,一种方法是(取决于您实际需要的详细信息):

import scala.reflect.ClassTag
class ParametricType[T](implicit val tag: ClassTag[T])

val clazz: Class[_] = ...
myMethod(new ParametricType()(ClassTag(clazz)))