识别并描述Scala的泛型类型约束

时间:2011-02-02 01:41:53

标签: generics scala

我见过“&lt ;:”和“>:”以及“<%”等,有人可以给出(或找到)这些的好描述吗?有什么可能的限制,他们做了什么,以及何时使用它们的例子?

2 个答案:

答案 0 :(得分:67)

S <: T表示ST的子类型。这也称为upper type bound。同样,S >: T表示ST的超类型,lower type bound

S <% T是一个视图范围,并表示S必须配备view,将其值映射为T类型的值。

这对我来说也很困惑,而且我还拥有伯克利的编程语言硕士学位。

答案 1 :(得分:54)

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

首先是类型界限:

  • <: - uppper type bound
  • >: - 下限类型

这些与java中的superextends基本相同,并且实际上会在生成的字节码中进行编码,这对于互操作很有用:)

然后是句法糖:

  • <% - 查看绑定
  • : - 上下文绑定

这些不是以Java可能理解的方式编码的(虽然它们在 scala签名中表示,scala添加到所有类以帮助编译器的注释,最终将是Scala反射库的基础)

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

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

因此,您不能将自己的implicits与视图边界或上下文边界组合在一起,因为Scala只允许一个标记为隐式的块用于任何函数或构造函数。

如果确实需要使用自己的implicits,则必须先将任何此类边界手动转换为unsugared版本,然后将其添加到隐式块中。