2011-02-02 120 views
45

我见过“<:”和“>:”和“<%”等,有人可以给(或定位)一个很好的描述这些?什么是可能的约束,他们做了什么以及什么时候使用它们的例子?确定和描述斯卡拉的泛型类型约束

+1

我喜欢这种解释http://stackoverflow.com/questions/2982276/what-is-a-context-bound-in-scala/2983376#2983376 – huynhjl 2011-02-02 03:06:20

+0

可能的重复[什么是Scala上下文和视图边界?] (http://stackoverflow.com/questions/4465948/what-are-scala-context-and-view-bounds) – Suma 2015-04-29 12:55:10

回答

67

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

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

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

52

有两种不同的东西在这里,但他们都知道的“边界”,而不是“限制” ...

首先是类型范围:

  • <: - uppper类型绑定
  • >: - 结合型低

这些是基本相同superextends在Java中,并实际上将在生成的字节码,这是很好的互操作:)被编码为这样

然后是语法糖:

  • <% - 视图绑定
  • : - 上下文界

这些在某种程度上的Java能了解(尽管它们是在斯卡拉签名表示,一个注解,SC不被编码ALA增加了所有课程,帮助编译器,并最终将是一个斯卡拉反射库的基础)

上述这些问题都转化为隐性参数:

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 

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

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