【问题标题】:Scala: generate class from a stringScala:从字符串生成类
【发布时间】:2013-08-21 18:50:17
【问题描述】:

我想从一个字符串动态创建一个类。

字符串具有类的确切名称(顺便说一句,它是一个 Java 类)

例如

val classString = "gui.MainFrame"

我创建了这个类

val mainClass: Class[_] = Class.forName(classString)

Scala 创建了这个类,但是如果我想使用这个类,例如

AppExecutor.executeNoBlock(classOf[mainClass])

Scala 告诉我找不到类型 mainClass。

如果我以这种方式使用它

AppExecutor.executeNoBlock(mainClass.asInstanceOf)

它说 java.lang.Class 不能转换为 scala.runtime.Nothing$ 那么我现在如何使用这个类呢?

【问题讨论】:

    标签: string class scala


    【解决方案1】:

    “你拿错了。”

    classOf 接受一个类型参数并返回一个Class 对象。您不能将 Class 对象作为类型参数传递,因此会出现错误。

    另外,您已经在mainClass 中拥有您的Class 对象。如果你想一定要使用classOf,你可以这样做:

    val mainClass = classOf[gui.MainFrame]
    

    相反。但否则你应该坚持你以前的方法,即:

    val mainClass = Class.forName(classString)
    

    如果您尝试使用的代码是org.jemmy.fx.AppExecutor,您可以直接使用mainClass 调用它:

    AppExecutor.executeNoBlock(mainClass.asInstanceOf[Class[_ <: javafx.application.Application]])
    

    因为该方法显然有一个合格的类型参数(即不是普通的通配符Class[_],或Java 表示法中的Class&lt;?&gt;)。

    【讨论】:

    • 是的,你是对的,我想使用 Jemmy 的 AppExecutor,我知道我可以直接用“mainClass”调用它,但问题是,“mainClass”的值不应该每次都一样。它应该是可变的,以便用户可以输入另一个使用 AppExecutor 启动的类。所以我不能使用 val mainClass = classOf[gui.MainFrame],因为它不会是可变的。
    • @AKR :就像我说的,如果是这种情况,你仍然可以使用Class.forName(classString),问题在于你如何调用executeNoBlock()
    • 我试过这样:“val mainClass = Class.forName(mainClassString)”,然后是“AppExecutor.executeNoBlock(mainClass)”,但这会导致错误消息“- 重载方法值 executeNoBlock 和替代品: (x$1: Class[_ <: javafx.application.application>[String])Unit (x$1: Class[_ <: javafx.application.application value>)])"
    • @AKR。那是另一个故事。不确定我的演员阵容是否正确,但请查看我的编辑。
    • 没问题。感谢您接受答案的建议,我是 stackoverflow 的新手,所以我现在还没有这个精彩网站的所有功能。 ;)
    猜你喜欢
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2012-08-19
    • 2015-06-05
    • 2011-05-27
    • 2014-01-15
    相关资源
    最近更新 更多