我正在编写一个程序,用户在命令行中指定类的路径。我通过以下方式将其转换为Class
对象:
val clazz = Class.forName(args([0]))
我有一个带有单个参数的参数类MyParametric[T]
。然后,我想要另一个 Class
类型Class[ParamatricType[clazz]
,以便我可以将其传递给方法,例如我想做像
myMethod(classOf[ParametricType[clazz]])
但不允许这样做。如何动态地给出类型参数来实例化参数类型?
答案 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)))