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

时间:2015-11-30 19:29:02

标签: scala types parametric-polymorphism

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

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

我有一个带有单个参数的参数类MyParametric[T]。然后,我想要另一个 Class类型Class[ParamatricType[clazz],以便我可以将其传递给方法,例如我想做像

这样的事情
myMethod(classOf[ParametricType[clazz]])

但不允许这样做。如何动态地给出类型参数来实例化参数类型?

4 个答案:

答案 0 :(得分:1)

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

myMethod(classOf[ParametricType[_]])

答案 1 :(得分:1)

function beforeSubmit(type){ if (type == "create" || type == "edit" || type == "xedit") { var status = nlapiGetContext().getSetting("SCRIPT", "..."); var amount = Number(nlapiGetContext().getSetting("SCRIPT", "...")); var nr = nlapiGetNewRecord(); //Attempt to get values normally var entitystatus = nr.getFieldValue("entitystatus"); var projectedtotal = Number(nr.getFieldValue("projectedtotal")); var id = nr.getId(); //If values were null, it's likely they were not edited and //thus not present in nr. Look them up. if(!entitystatus){ entitystatus = nlapiLookupField("opportunity", id, "entitystatus"); } if(!projectedtotal){ projectedtotal = Number(nlapiLookupField("opportunity", id, "projectedtotal")); } if (entitystatus == status && projectedtotal >= amount) { var message = "ERROR..."; throw nlapiCreateError("101", message, true); } } } 的类型参数将被删除,因此无论您插入ParametricType(包括classOf[ParametricType[_]]),_的值都是相同的。

类型_不同,与未擦除的相同(编译器在编译时保持跟踪)。你可以参考单身人士类型classOf,但不清楚会给你带来什么。

答案 2 :(得分:0)

根据您提供的信息,很难判断用户是否会从已知类别(例如水果)或任何可想象的类别中指定。但是,您可以在赋值期间使用不同类的模式匹配,并根据类型处理它。

答案 3 :(得分:0)

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

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

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