2012-01-26 43 views
1

我們從Java API獲得了Selenium WebElement,但我們創建了Scala類,Element和mixin更具體的特徵(例如可點擊,可提交等)。在Scala中保留具有返回值的mixin特性

我們的方法是這樣的:

toScalaElement(e : WebElement) = { 
    e.type match { 
     case Input => new Element(e) with Submittable 
     case Link => new Element(e) with Clickable 
     ... 
     case _ => new Element 
    } 
} 

返回類型總是元素因爲這是根類的所有案件。但是,我們希望在返回時保留mixin特徵。

建議您查看Scala的Collections API中的構建器,但我們不確定它與這個特定應用程序的關係。顯然,如果有比特性mixins更好的方法,解決方案將被讚賞。

更新:我改變了大小寫來匹配子類型而不是字符串,但問題的本質保持不變。

回答

2

我不認爲這是可行的。整個方法需要有一個返回類型。在構建器的情況下,這種返回類型是通用的,因此可以在方法調用之間有所不同,但編譯器需要具有不同類型的參數來選擇構建器。它看起來像這樣:

case class WebElementConverter[T1, T2](f: T1 => T2) { 
    def convert(e: T1) = f(e) 
} 

object WebElementConverter { 
    implicit val inputConverter = WebElementConverter[Input, Element with Submittable](x => new Element(x) with Submittable) 
    // other converters 
} 

def toScalaElement[T1 <: WebElement, T2 <: Element](e : T1)(implicit b: WebElementConverter[T1, T2]) = b.convert(e) 

在這裏,現在你可以得到想要的結果

val i = new Input // same as val i: Input = new Input 
toScalaElement(i) 

但不是在這裏:

val i: Element = new Input 
toScalaElement(i) // looks for an implicit WebElementConverter[Element, <some type>] 

因此,如果靜態類型的e只是WebElement,建設者不幫忙。

0

type是Scala的關鍵字,雖然我不知道什麼硒的its API一個谷歌的顯示有上WebElement沒有type方法返回一個String。所以它看起來像是誤解了關鍵字type的作用,以及模式匹配是如何工作的。你應該看看這些,但是簡單地說,如果你有一個類Input那就是WebElement一個子類,你可以匹配類型與

def toScalaElement(e: WebElement) = e match { 
    case x: Input => new Element(x) with Submittable 
    // etc 
+1

看起來我有點誤解了這個問題。如果你這樣做,方法類型當然是'元素'沒有任何mixin。要使用mixin,您必須在使用站點進行模式匹配。 –