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