Как я могу использовать класс манифеста Scala для создания экземпляра стертого класса во время выполнения? - PullRequest
3 голосов
/ 08 октября 2010

Я делаю кое-что из WebDriver + PageObject.

(Если вы не знакомы с PageObjects, это шаблон, в котором у вас есть класс, представляющий каждую страницу вашего сайта, который предоставляет все функции страницы с использованием языка домена, скрывая HTML-материал из теста.) *

Я хочу быть ленивым и иметь один метод 'submit' в моем абстрактном классе 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]

Я думал, что я умный, но, очевидно, я не умный. ;) Что я делаю не так?

Ответы [ 2 ]

5 голосов
/ 08 октября 2010

Вам нужно сделать так, чтобы ваш Manifest был связан с параметром типа, т.е.

def submitExpecting[P <: Page[P]](implicit m: Manifest[P]): P
1 голос
/ 27 июня 2011

В дополнение к ответу Бена вы можете рассмотреть возможность использования синтаксиса Scala 2.8.x:

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

После этого вы можете получить доступ к манифесту через конструкцию manifest[P].Это чувствует себя немного чище в целом (по крайней мере для меня ...)

...