0

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

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))

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

4

2 回答 2

3

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

请注意,尽管引入了上下文边界和清单是为了解决通用数组创建的问题,所以在这里使用一个没有意义,因为您的函数 - 如上所示 - 与数组无关。

于 2013-01-07T12:23:22.317 回答
2

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

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

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

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

这称为上下文绑定

这解释了为什么您会得到关于Double不采用类型参数的诊断。

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

于 2013-01-08T00:55:53.220 回答