【Scala十八】视图界定与上下文界定

编程技术  /  houtizong 发布于 3年前   187

Context Bound,上下文界定,是Scala为隐式参数引入的一种语法糖,使得隐式转换的编码更加简洁。

 

隐式参数

首先引入一个泛型函数max,用于取a和b的最大值

  def max[T](a: T, b: T) = {    if (a > b) a else b  }

 因为T是未知类型,只有运行时才会代入真正的类型,因此调用a > b是不正确的,因为T不确定,也就不确定T是否有>这个函数定义。

 

引入类型隐式转换,

因为Comparator类型是可比较较的,因此定义一个类型的隐式转换,将T转换为Comparator[T],

 


  def max[T](a: T, b: T)(implicit m: T => Comparator[T]) = {    if (m.compareTo(a,b)< 0) b else a  }

 

 

 

使用:

class A(val weight: Int)object ContextBound {  def max[T](a: T, b: T)(implicit m: T => Comparator[T]) = {    if (m.compareTo(a,b)< 0) b else a  }  def main(args: Array[String]) {    implicit def toComparator(obj: A) = new Comparator[A] {          override def compare(o1: A, o2: A): Int = o1.weight - o2.weight;    }    println(max(new A(300), new A(400)).weight)  }

 

上下文界定

 

 

Context Bound的目的是省略隐式值的书写:

 

  def max[T](a: T, b: T)(implicit m:Comparator[T]) = {    if (m.compareTo(a, b) < 0) b else a  }

 

ContextBound:

存在一个隐式值,这个隐式对象以参数T为泛型参数,实现某种操作

package examples.scala.implicitsimport java.util.Comparatorclass A(val weight: Int)object ContextBound {  def max[T: Comparator](a: T, b: T) = {    val c = implicitly[Comparator[T]]    if (c.compare(a, b) < 0) b else a  }  def main(args: Array[String]) {    //implicitly查找的是类型为Comparator[T]的隐式值,而不是隐式类型转换函数    implicit val toComparator = new Comparator[A] {      override def compare(o1: A, o2: A): Int = o1.weight - o2.weight;    }    println(max(new A(300), new A(400)).weight)  }}

 

视图界定

存在一个类型转换函数,将T转换为Ordered[T]

object ViewBound {  def max[T <% Ordered[T]](a: T, b: T) = {    if (a.compare(b) < 0) b else a;  }  def main(args: Array[String]) {    implicit def toOrdered(a: A) = new Ordered[A] {      override def compare(that: A): Int = a.weight - that.weight    }    println(max(new A(300), new A(400)).weight)  }}

 

 

 

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客