在Scala中进行实验时,我经常发现自己想为定义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
容器中会出现同样的问题。
答案 0 :(得分:2)
这对我有用:
def getReverse[A](xs: {def reverse: A}): A = xs.reverse
scala> getReverse("1234")
res10: scala.collection.immutable.WrappedString = 4321
显然在没有括号的结构类型中定义reverse
。