类型参数和上限类型

时间:2013-01-07 12:15:59

标签: scala types

无法弄清楚为什么这不起作用:

def f[A: Double](x: A) = x / 4 // error: "Double does not take type parameters"

println(f(87.7))

虽然这个有效:

def f[A <: Double](x: A) = x / 4

println(f(87.7))

唯一的区别是,在第一种情况下,我只指定特定类型,在第二种情况下,我定义了类型上限。

2 个答案:

答案 0 :(得分:3)

那是因为[A: Double]不是定义类型参数的正确方法。此表单适用于定义类清单 上下文绑定(Scala 2.8中的新内容 - 感谢@mhs链接);但是,用于表示上下文边界的ClassManifest[T]类型是参数化类型,因此Double不适合作为类清单。

注意虽然引入了上下文边界和清单来解决泛型数组创建的问题,但是在这里使用一个没有意义,因为你的函数 - 如上所示 - 与数组无关。

答案 1 :(得分:2)

当形式类型参数具有此定义中的形式时:

def floob[Glorp : Fleeb](arg1: Glorp): Swish = ...

......这只是这个定义的语法糖:

def floob[Glorp](arg1: Glorp)(implicit i1: Fleeb[Glorp]): Swish = ...

这称为上下文绑定

这解释了为什么您要获取有关Double未采用类型参数的诊断。

因为单个冒号的使用与类型注释和类型归属中使用的完全无关,所以我统一在冒号的两边用空格写入上下文边界,并且永远不会写入类型注释或类型归属,并且在左(当需要时,左边的名称是标点符号而不是字母数字)。