确定并描述Scala的genericstypes约束

我见过“<:”和“>:”和“<%”等,有人可以给(或定位)一个很好的描述这些? 什么是可能的限制,他们做什么,什么时候使用它们的例子?

S <: T表示ST一个子types。 这也被称为上限types界限 。 同样, S >: T意味着ST一个超types,一个较低的types边界 。

S <% T是一个视图绑定,并表示S必须配备一个视图 ,将其值映射到typesT值。

这也让我感到困惑,而且我有一个来自伯克利的编程语言硕士。

这里有两种不同的野兽,但它们都被认为是“边界”而不是“约束”…

首先是types边界:

  • <: – upppertypes绑定
  • >: – 较低的types绑定

这些基本上和super相同,并在java中进行了extends ,实际上将在生成的字节码中进行编码,这对interop 🙂

然后是语法糖:

  • <% – 查看界限
  • : – 上下文绑定

这些不是以Java可能理解的方式进行编码的(尽pipe它们在scala签名中表示,scala为所有类提供了一个注释,以帮助编译器,并最终成为Scalareflection库的基础)

这两个都转换为隐式参数:

 def fn[A <% B](arg: A) = ... //sugared def fn[A](arg: A)(implicit ev: A => B) = ... //unsugared def fn[A : Numeric](arg: A) = ... //sugared def fn[A](arg: A)(implicit ev: Numeric[A]) = ... //unsugared 

因为这个原因,你不能将自己的隐含与视图边界或上下文边界结合起来,因为Scala只允许为任何函数或构造函数标记为隐式的一个块。

如果您确实需要使用自己的含义,那么您必须首先手动将任何这样的边界转换为unsugared版本并将其添加到隐式块中。