【问题标题】:How can I use Scala's Manifest class to instantiate the erased class at runtime?如何使用 Scala 的 Manifest 类在运行时实例化已擦除的类?
【发布时间】:2011-04-22 20:47:14
【问题描述】:

我正在做一些 WebDriver+PageObject 的东西。

(如果您不熟悉 PageObjects,这是一种模式,其中您有一个代表站点上每个页面的类,它使用域语言公开页面的所有功能,从测试中隐藏 HTML 内容。)

我想偷懒,在我的抽象 Page 类中有一个“提交”方法,我的所有其他 Page 都从该类扩展。我也希望这个方法新建下一个 Page 子类并返回它。

这是我在 Page 类中的内容:

def submitExpecting[P <: Page[P]](implicit m: Manifest[_]): P = {
  driver.findElement(By.xpath("//input[@type='submit']")).click
  m.erasure.getConstructor(classOf[WebDriver]).newInstance(driver).asInstanceOf[P]
}

我是这样称呼它的:

val userHomePage = userSignupPage
      .login("graham")
      .acceptTermsAndConditions
      .submitExpecting[UserHomePage]

编译这个,我得到:

error: could not find implicit value for parameter m: Manifest[_]
.submitExpecting[UserHomePage]

我以为我很聪明,但显然我不是。 ;) 我做错了什么?

【问题讨论】:

    标签: generics reflection scala manifest instantiation


    【解决方案1】:

    您需要使您的Manifest 与类型参数相关,即

    def submitExpecting[P <: Page[P]](implicit m: Manifest[P]): P
    

    【讨论】:

      【解决方案2】:

      除了 Ben 的回答,您可能还想考虑使用 Scala 2.8.x 语法:

      def submitExpecting[P <: Page[P] : Manifest]: P
      

      之后,您可以通过 manifest[P] 构造访问清单。整体感觉更干净一些(至少对我来说......)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-12
        • 2022-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-20
        • 1970-01-01
        相关资源
        最近更新 更多