【Scala之旅】隐式参数和隐式转换
隐式参数一个方法可以有一个隐式 参数列表,在参数列表的开始处由 implicit 关键字标记。如果参数列表中的参数没有像往常那样传递,Scala 会查看它是否可以获得正确类型的隐式值,如果可以,则自动传递它。 Scala 将寻找的这些参数分为两类:
在常见问题解答中可以找到有关 Scala 寻找隐含位置的更详细指南 在下面的例子中,我们定义了一个方法 abstract class SemiGroup[A] { def add(x: A,y: A): A } abstract class Monoid[A] extends SemiGroup[A] { def unit: A } object ImplicitTest extends App { implicit object StringMonoid extends Monoid[String] { def add(x: String,y: String): String = x concat y def unit: String = "" } implicit object IntMonoid extends Monoid[Int] { def add(x: Int,y: Int): Int = x + y def unit: Int = 0 } def sum[A](xs: List[A])(implicit m: Monoid[A]): A = if (xs.isEmpty) m.unit else m.add(xs.head,sum(xs.tail)) println(sum(List(1,2,3))) // uses IntMonoid implicitly println(sum(List("a","b","c"))) // uses StringMonoid implicitly }
为了显示隐式参数如何工作,我们首先分别为字符串和整数定义 Monoid 方法 在我们的 首先,Scala 将寻找隐式定义和隐式参数,它们可以在带有隐式参数块的方法被调用(不带前缀)时被直接访问。
第二次求和传递一个 下面是Scala程序的输出: 6 abc 隐式转换从类型 隐式转换适用于两种情况:
在第一个例子中,一个转换 如果隐式方法 List(1,3) <= List(4,5) 隐式方法 import scala.language.implicitConversions implicit def list2ordered[A](x: List[A]) (implicit elem2ordered: A => Ordered[A]): Ordered[List[A]] = new Ordered[List[A]] { //replace with a more useful implementation def compare(that: List[A]): Int = 1 } 隐式导入的对象 例如,当期望调用 import scala.language.implicitConversions implicit def int2Integer(x: Int) = java.lang.Integer.valueOf(x) 如果在编译隐式转换定义时不加区别地使用编译器警告的话,隐式转换可能会有陷阱。 要关闭这些警告,请采取以下行动:
编译器应用转换时就不会发出警告了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |