2014-02-12 210 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