【问题标题】:Identify and describe Scala's generic type constraints识别和描述 Scala 的泛型类型约束
【发布时间】:2011-02-02 01:41:52
【问题描述】:

我见过<:>:<% 等。有人可以给出(或找到)这些的详细描述吗?有哪些可能的限制条件,它们的作用是什么,以及何时使用它们的示例?

【问题讨论】:

标签: generics scala


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

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

首先是类型界限:

  • <: - 上层类型绑定
  • >: - 下界

这些本质上与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

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

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

【讨论】:

  • 嗨@Kevin wright,为什么你说这不是约束?那么什么是约束呢?
猜你喜欢
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多