如何使用Scala的Manifest类在运行时实例化已擦除的类?

时间:2010-10-08 12:17:38

标签: generics reflection scala manifest instantiation

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

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

我想变得懒惰,并且在我的抽象Page类中有一个'submit'方法,我的所有其他Pages都扩展了。我也希望这个方法能够新建下一个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]

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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

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

之后,您可以通过manifest[P]构造访问清单。整体感觉有点干净(至少对我而言......)