我看到了一些例子,其中一个转换函数T => S
作为隐式参数传递。斯卡拉calls这个函数view
,甚至提供特殊的语法糖 - view bound
- 对于这种情况。关于Scala中视图的问题
但是,我们已经有隐式转换!我可以用隐式转换替换这些views
(即转换函数作为隐式参数传递)吗? ?我能做些什么views
我不能用隐式转换吗?
我看到了一些例子,其中一个转换函数T => S
作为隐式参数传递。斯卡拉calls这个函数view
,甚至提供特殊的语法糖 - view bound
- 对于这种情况。关于Scala中视图的问题
但是,我们已经有隐式转换!我可以用隐式转换替换这些views
(即转换函数作为隐式参数传递)吗? ?我能做些什么views
我不能用隐式转换吗?
我你的问题的理解是,会是什么
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.一个例子是有序:
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)
两个以上的用例图界限:
你所说的隐式转换只不过是全局范围内的一个视图而已。
在使用类型参数时,必须使用视图边界,因为这是一个需要隐式转换的标志。例如:
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)
是无效的编译器。