我如何使用Scala的Manifest类在运行时实例化已擦除的类? [英] How can I use Scala's Manifest class to instantiate the erased class at runtime?
问题描述
(如果你不熟悉PageObjects,这是一个模式,你有一个表示你的每个页面的类该网站使用领域语言公开了页面的所有功能,隐藏测试中的HTML内容。)
我想要懒惰,并有一个'submit'方法在我的抽象页面类中,我的所有其他页面都从中延伸。我还希望此方法能够创建下一个Page子类并将其返回。
以下是我在Page类中的内容:
$ b
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]
$ c $ 错误:无法找到参数m的隐式值:Manifest [_]
.submitExpecting [UserHomePage]
我认为我很聪明,但显然我不是。 ;)
我在做什么错了?
解决方案您需要将 Manifest
与类型参数相关,即
def submitExpecting [P<:Page [P]] (隐含的m:Manifest [P]):P
I'm doing some WebDriver+PageObject stuff.
(If your not familiar with PageObjects, this is a pattern where you have a class representing each page on your site which exposes all the functions of the page using the domain language, hiding the HTML stuff from the test.)
I want to be lazy and have one 'submit' method in my abstract Page class that all my other Pages extend from. I also want this method to new up the next Page subclass and return it.
Here is what I have in the Page class:
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]
}
and here's how I'm calling it:
val userHomePage = userSignupPage
.login("graham")
.acceptTermsAndConditions
.submitExpecting[UserHomePage]
Compiling this, I get:
error: could not find implicit value for parameter m: Manifest[_]
.submitExpecting[UserHomePage]
I thought I was being smart, but clearly I'm not. ;)
What am I doing wrong?
解决方案 You need to make your Manifest
be related to the type parameter, i.e.
def submitExpecting[P <: Page[P]](implicit m: Manifest[P]): P
这篇关于我如何使用Scala的Manifest类在运行时实例化已擦除的类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!