我看到了一些示例,其中转换函数T => S
作为隐式参数传递。 Scala calls这个函数view
甚至为这种情况提供了特殊的语法糖 - view bound
。
但是我们已经进行了隐式转换!我可以用隐式转换替换这些views
(即作为隐式参数传递的转换函数)吗? ?我可以用views
做什么,我无法进行隐式转换?
答案 0 :(得分:9)
我对你的问题的理解是,
的优点是什么case class Num(i: Int)
implicit def intToNum(i: Int) = Num(i)
def test[A <% Num](a: A): Int = a.i
test(33)
在
def test2(a: Num): Int = a.i
test2(33)
是?那么视图的含义正是如此:类型T可以被视为另一种类型S.您的方法或函数可能首先想要处理T.一个例子是Ordered:
def sort[A <% Ordered[A]](x: A, y: A): (A, A) = if (x < y) (x, y) else (y, x)
sort(1, 2) // --> (1,2)
sort("B", "A") // --> (A,B)
视图边界的另外两个用例:
答案 1 :(得分:3)
您所谓的隐式转换只不过是全局范围内的视图。
在使用类型参数时,必须使用视图边界,因为它表示需要进行隐式转换。例如:
def max[T](a: T, b: T): T = if (a < b) b else a
因为T
上没有任何约束,编译器不知道<
方法可用。让我们看看编译器让你继续,然后考虑这两个调用:
max(1, 2)
max(true, false)
签名max[T](a: T, b: T): T
中没有任何内容告诉编译器它不应该允许第二次调用,但是应该允许第一次调用。这是视图界限的来源:
def max[T <% Ordered[T]](a: T, b: T): T = if (a < b) b else a
这不仅告诉编译器<
方法的来源,还告诉编译器max(true, false)
无效。