Scala反射--从该类类型的类名字符串创建示例

ppcbkaq5  于 2022-12-13  发布在  Scala
关注(0)|答案(3)|浏览(144)

我只是到处搜索。我如何从String(类名)创建一个新示例并返回这个示例?确实有答案,但他们没有回答我如何将这个示例转换为我想要的类型。例如:

class ABC
{
  //some code
}

现在我想创建一个示例,使用类的名称“ABC”(与瓦尔abc = new ABC()相同)。

val mirror = universe.runtimeMirror(getClass.getClassLoader);
val classInstance = Class.forName("ABC");
val classSymbol = mirror.classSymbol(classInstance);
val classType = classSymbol.toType;//println(classType) gives ABC
/******this line does not work*****/
classInstance.newInstance().asInstanceOf[classType];
// not asInstanceOf[ABC]
/***********/

因为classInstance.newInstance()的类型是“Any”,我怎样才能把它转换成“ABC”类型呢?谢谢!

f45qwnt8

f45qwnt81#

Scala的类型转换语法是x.asInstanceOf[ABC],其中x是你的对象(在上面的代码中是classInstance.newInstance()),ABC是你要转换的类型。注意,括号是方括号,而不是圆括号--这是一个无参数的方法,需要一个类型参数。

hjzp0vay

hjzp0vay2#

我可能错了,但我认为你要找的东西没有意义。为了论证起见,假设你可以这样做。测试题是:你下一步要做什么?编译器显然不知道它是什么类,所以你不能直接调用方法或访问它的字段。
因此,我认为您可能需要使用反射(Scala或Java),因此不需要 asInstanceOf

vh0rcniy

vh0rcniy3#

目前您可以使用白盒宏。它可以返回比声明的更精确的类型
第一个
How to obtain a Trait/Class from a string with its name

相关问题