在Scala中,View Bound( A <% B )捕获了'can be seen as'的概念(而上限 <: 捕获了'is a'的概念) . 上下文绑定( A : C )表示关于类型的'has a' . 您可以阅读有关清单的示例“ T 有 Manifest ” . 您链接到 Ordered vs Ordering 的示例说明了差异 . 一个方法
def example[T <% Ordered[T]](param: T)
说该参数可以看作 Ordered . 与之比较
def example[T : Ordering](param: T)
表示该参数具有关联的 Ordering .
在使用方面,需要花费一些时间来 Build 约定,但是上下文边界优于视图边界(view bounds are now deprecated) . 一个建议是,当您需要将隐式定义从一个范围转移到另一个范围而不需要直接引用它时,首选上下文绑定(这对于用于创建数组的 ClassManifest 来说肯定是这种情况) .
4 回答
你找到了this article吗?它涵盖了在数组改进的上下文中的新上下文绑定功能 .
通常,具有上下文绑定的类型参数的形式为
[T: Bound]
;它被扩展为普通类型参数T
以及类型为Bound[T]
的隐式参数 .考虑方法
tabulate
,它根据从0到给定长度的数字范围应用给定函数f的结果形成数组 . 对于Scala 2.7,表格可以写成如下:在Scala 2.8中,这不再可能,因为运行时信息是创建
Array[T]
的正确表示所必需的 . 需要通过将ClassManifest[T]
作为隐式参数传递给方法来提供此信息:作为简写形式,可以在类型参数
T
上使用上下文绑定,给出:Robert的答案涵盖了Context Bounds的技术细节 . 我会告诉你我们对它们意义的解释 .
在Scala中,View Bound(
A <% B
)捕获了'can be seen as'的概念(而上限<:
捕获了'is a'的概念) . 上下文绑定(A : C
)表示关于类型的'has a' . 您可以阅读有关清单的示例“T
有Manifest
” . 您链接到Ordered
vsOrdering
的示例说明了差异 . 一个方法说该参数可以看作
Ordered
. 与之比较表示该参数具有关联的
Ordering
.在使用方面,需要花费一些时间来 Build 约定,但是上下文边界优于视图边界(view bounds are now deprecated) . 一个建议是,当您需要将隐式定义从一个范围转移到另一个范围而不需要直接引用它时,首选上下文绑定(这对于用于创建数组的
ClassManifest
来说肯定是这种情况) .另一种思考视图边界和上下文边界的方法是,第一种方式是从调用者的范围转移隐式转换 . 第二个从调用者的范围传输隐式对象 .
(这是一个括号内容 . 请先阅读并理解其他答案 . )
Context Bounds实际上概括了View Bounds .
所以,鉴于这个代码用View Bound表示:
这也可以用Context Bound表示,借助于表示类型
F
到类型T
的函数的类型别名 .上下文绑定必须与类型
* => *
的类型构造函数一起使用 . 但是类型构造函数Function1
属于(*, *) => *
. 类型别名的使用部分地应用类型为String
的第二类型参数,从而产生正确类型的类型构造函数以用作上下文绑定 .有一个建议允许您直接在Scala中表达部分应用的类型,而不使用特征中的类型别名 . 然后你可以写:
这是另一个括号内容 .
如Ben pointed out,上下文绑定表示类型参数和类型类之间的"has-a"约束 . 换句话说,它表示存在特定类型类的隐式值的约束 .
在利用上下文绑定时,通常需要表达隐式值 . 例如,给定约束
T : Ordering
,通常需要满足约束的Ordering[T]
实例 . As demonstrated here,可以使用implicitly
方法或稍微有用的context
方法访问隐式值:要么