确定并描述Scala的genericstypes约束
我见过“<:”和“>:”和“<%”等,有人可以给(或定位)一个很好的描述这些? 什么是可能的限制,他们做什么,什么时候使用它们的例子?
S <: T
表示S
是T
一个子types。 这也被称为上限types界限 。 同样, S >: T
意味着S
是T
一个超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版本并将其添加到隐式块中。