2

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

val clazz = Class.forName(args([0]))

我有一个MyParametric[T]带有单个类型参数的参数类。然后我想做另一种 Class类型Class[ParamatricType[clazz],这样我就可以将它传递给一个方法,例如我想做类似的事情

myMethod(classOf[ParametricType[clazz]])

但这是不允许的。如何使用动态给出的类型参数来实例化参数类型?

4

4 回答 4

1

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

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

于 2015-11-30T19:59:47.830 回答
1

如果你想用它作为 的参数classOf,你甚至不需要类型参数。您可以只使用_,因为在 Scala 中,类型参数在运行时会被删除:

myMethod(classOf[ParametricType[_]])
于 2015-11-30T19:57:25.847 回答
0

如果您需要做的事情超过classOf(其他答案已经处理)并且可以修改ParametricType,一种方法是(取决于您实际需要的细节):

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

val clazz: Class[_] = ...
myMethod(new ParametricType()(ClassTag(clazz)))
于 2015-11-30T20:24:00.000 回答
0

根据您提供的信息,很难判断用户是从一组已知类(例如水果)还是任何可以想象的类中指定。但是,您可以在分配期间对不同的类使用模式匹配,并根据类型进行处理。

于 2015-11-30T20:15:02.850 回答