无法弄清楚为什么这不起作用:
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))
唯一的区别是在第一种情况下我只指定特定类型,而在第二种情况下我定义类型上限。
那是因为[A: Double]
不是定义类型参数的正确方法。此表单适用于定义类清单 上下文绑定(Scala 2.8 中的新功能 - 感谢@mhs 提供链接);但是,ClassManifest[T]
用于表示上下文边界的类型是参数化类型,因此Double
不适合作为类清单。
请注意,尽管引入了上下文边界和清单是为了解决通用数组创建的问题,所以在这里使用一个没有意义,因为您的函数 - 如上所示 - 与数组无关。
当形式类型参数具有此定义中的形式时:
def floob[Glorp : Fleeb](arg1: Glorp): Swish = ...
...它只是这个定义的语法糖:
def floob[Glorp](arg1: Glorp)(implicit i1: Fleeb[Glorp]): Swish = ...
这称为上下文绑定。
这解释了为什么您会得到关于Double
不采用类型参数的诊断。
因为单冒号的这种用法与类型注释和类型归属中使用的完全无关,所以我统一在冒号两边用空格写上下文边界,从不写类型注释或在左边有空格的类型归属(除了需要时,当左边的名称是标点符号而不是字母数字时)。