2014-02-12 140 views
0

而在斯卡拉實驗,我經常發現自己想要定義一個函數,該函數定義foo所有類型。我可以結構打字簡單的情況下做到這一點,但它分崩離析時,需要一個類型參數。結構類型

這裏有一個簡單的例子:

def reverse[A](xs: { def reverse(): A }): A = xs.reverse 

此編譯沒有錯誤,但在傳遞一個類型定義了reverse功能,並出現以下錯誤失敗:

scala> reverse("string") 
<console>:13: error: type mismatch; 
found : String("adsf") 
required: AnyRef{def reverse(): ?} 
       reverse("adsf") 
        ^

我也試過定義類型參數的結構邊界[A <: { def reverse(): A }],但得到相同的結果。它看起來像我可以在這裏類型擦除的受害者(看到它預計reverse的結果是?)。

我不知道如果這種類型的約束在Scala的類型系統是不可能的,或者如果我失去了一些東西。有一種方法可以爲具有泛型參數的函數定義結構類型嗎?


注:我簡單地認爲我在給定的例子問題是reverse實際上是在StringOps,不串定義。不幸的是,將我的字符串包裝在StringOps容器中會出現同樣的問題。

回答

2

這個工作對我來說:

def getReverse[A](xs: {def reverse: A}): A = xs.reverse 

scala> getReverse("1234") 
res10: scala.collection.immutable.WrappedString = 4321 

的結構型式不帶括號的作品顯然定義reverse

+0

顯然,你不能包含空括號。我認爲它將其解釋爲需要「單元」或其他東西?似乎可以使用'def reverse [A](xs:{def reverse:A}):A = xs.reverse',所以命名不成問題。這似乎是可能有更好的錯誤信息的東西。 – KChaloux

+0

是的,剛剛嘗試過我自己的課程。函數'def getValue:A'和'def getValue():A'並不都被結構類型{def getValue:A}所捕獲 - 只有前者是。奇怪的。 – KChaloux

+0

@KChaloux好吧,我正在更新答案,提到括號而不是名稱範圍。 – vptheron