3

我在问自己什么是视图绑定等价于

(implicit conv: String => A)

我的第一次尝试是简单地声明类型参数A,如下所示:

[String <% A]

但是 Scala 编译器抱怨"not found: type A"

有什么建议么?

4

2 回答 2

8

--修改后的帖子--

语法[B <% A]实际上绑定了一个新类型B。所以

class Foo[A, String <% A]

相当于

class Foo[A, String](implicit $conv: String => A)

whereString是任意类型参数,而不是您正在考虑的类。

我认为命名的隐式转换可能是你最好的选择,

class Foo[A](implicit conv: String => A)

现在的类型String没有阴影。

总结:视图边界在引入的类型参数转换时很有用,而不是类型参数。

于 2011-08-23T21:27:44.523 回答
2

那不是视图绑定。视图绑定表示类型参数A是有界的,因为它可以被视为(转换为)类型B。你有什么反转类型和类型参数,所以它不符合条件。

为了让事情更清楚,界限是对“自由”类型的限制——一个类型参数。例如:

type A <: String // A has an upper bound
type A >: String // A has a lower bound

因此,视图边界也是一种限制——通过一种非常不同的机制施加的限制。因此,它只能施加在类型参数上,而不是类型上。

当然,说String => A必须存在也是一种约束,但不是一个有名称或句法糖的约束。

于 2011-08-24T15:12:21.820 回答