无法弄清楚为什么这不起作用:
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))
唯一的区别是,在第一种情况下,我只指定特定类型,在第二种情况下,我定义了类型上限。
答案 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
未采用类型参数的诊断。
因为单个冒号的使用与类型注释和类型归属中使用的完全无关,所以我统一在冒号的两边用空格写入上下文边界,并且永远不会写入类型注释或类型归属,并且在左(当需要时,左边的名称是标点符号而不是字母数字)。