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
容器中會出現同樣的問題。
顯然,你不能包含空括號。我認爲它將其解釋爲需要「單元」或其他東西?似乎可以使用'def reverse [A](xs:{def reverse:A}):A = xs.reverse',所以命名不成問題。這似乎是可能有更好的錯誤信息的東西。 – KChaloux
是的,剛剛嘗試過我自己的課程。函數'def getValue:A'和'def getValue():A'並不都被結構類型{def getValue:A}所捕獲 - 只有前者是。奇怪的。 – KChaloux
@KChaloux好吧,我正在更新答案,提到括號而不是名稱範圍。 – vptheron