我在问自己什么是视图绑定等价于
(implicit conv: String => A)
我的第一次尝试是简单地声明类型参数A
,如下所示:
[String <% A]
但是 Scala 编译器抱怨"not found: type A"。
有什么建议么?
我在问自己什么是视图绑定等价于
(implicit conv: String => A)
我的第一次尝试是简单地声明类型参数A
,如下所示:
[String <% A]
但是 Scala 编译器抱怨"not found: type A"。
有什么建议么?
--修改后的帖子--
语法[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
没有阴影。
总结:视图边界在从引入的类型参数转换时很有用,而不是到类型参数。
那不是视图绑定。视图绑定表示类型参数A
是有界的,因为它可以被视为(转换为)类型B
。你有什么反转类型和类型参数,所以它不符合条件。
为了让事情更清楚,界限是对“自由”类型的限制——一个类型参数。例如:
type A <: String // A has an upper bound
type A >: String // A has a lower bound
因此,视图边界也是一种限制——通过一种非常不同的机制施加的限制。因此,它只能施加在类型参数上,而不是类型上。
当然,说String => A
必须存在也是一种约束,但不是一个有名称或句法糖的约束。