2011-04-02 134 views
3

我看到了一些例子,其中一个转换函数T => S作为隐式参数传递。斯卡拉calls这个函数view,甚至提供特殊的语法糖 - view bound - 对于这种情况。关于Scala中视图的问题

但是,我们已经有隐式转换!我可以用隐式转换替换这些views(即转换函数作为隐式参数传递)吗? ?我能做些什么views我不能用隐式转换吗?

回答

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.一个例子是有序:

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) 

两个以上的用例图界限:

  • 你可能想在T转换至S只在某些情况下,例如懒惰的 (这与上面的情况是一样的:你基本上想和T一起工作)
  • 你可能想链锁隐式转换。看到这篇文章:How can I chain implicits in Scala?
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)是无效的编译器。