Scala中的隐式转换|理解

Posted 无生活不技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala中的隐式转换|理解相关的知识,希望对你有一定的参考价值。

Scala语言在2.10版本后,引入了一种叫做隐式类的新特性。隐式类指的是用implicit关键字修饰的类。在对应的作用域内,带有这个关键字的类的主构造函数可用于隐式转换。

 


通俗的

当Scala编译器进行类型匹配时,如果找不到合适的类型,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型。


隐式转换有四种常见的使用场景:

  • 将某一类型转换成预期类型

  • 类型类

  • 模拟新的语法

  • 类型增强与扩展

Scala中的隐式转换|理解

首先:具体的使用场景例子可以参考官方文档,这里引用官方文档中关于隐式类的限制有哪些:

1.Theymust be defined inside of another trait/class/object.

    只能在别的trait/类/对象内部定义。

    object Helpers {

       implicit class RichInt(x: Int) 

        // right!

    }

    implicit class RichDouble(x: Double)

     // error!

 

2.Theymay only take one non-implicit argument in their constructor.

    构造函数只能带一个非隐式参数,虽然我们可以创建带有多个非隐        式参数的隐式类,但这些类无法用于隐式转换。

     implicit class RichDate(date: java.util.Date)

     // right!

     implicit class Indexer[T](collecton: Seq[T],index: Int)

     // error!

     implicit class Indexer[T](collecton:Seq[T])(implicit index: Index)

    //  error!

 

3.Theremay not be any method, member or object in scope with the same name as theimplicit class.

Note:This means an implicit class cannot be a case class.

在同一作用域内,不能有任何方法、成员或对象与隐式类同名

注意:这意味着隐式类不能是case class。 

    objectBar

    implicitclass Bar(x: Int) 

    // error!

    val x = 5

    implicitclass x(y: Int) 

    // error

    implicitcase class Baz(x: Int)

    // error

 

然后:什么叫一个类型的隐式作用域?

一个类型的隐式作用域指的是与该类型相关联的类型的所有的伴生对象。

它主要包括,当前作用域下(显示声明和import导入),以及相关联的作用域。包括如下几种:

  • 如T是这样定义的:T with A with B with C,那么A, B, C的伴生对象都是T的查找区域。

  • 如T是类型参数,那么参数类型和基础类型都是T的查找区域。

  • 如T是一个单例类型A.T,那么A和T都是查找区域

  • 如T是类型注入A#T,那么A和T都是查找区域。

reference:

  • Scala in depth

  • 官方文档 http://docs.scala-lang.org/tour/tour-of-scala.html


最后:举一个简单的demo

Scala中的隐式转换|理解

运行main方法结果如下:

结束语:深入理解隐式转换,对学习其他Scala写的开源框架是不可避免的,值得大家花点时间磕一下。

以上是关于Scala中的隐式转换|理解的主要内容,如果未能解决你的问题,请参考以下文章

转载:深入理解Scala的隐式转换系统

Scala的隐式转换

25.scala的隐式转换

scala中的隐式json转换器在运行时为null

scala学习笔记-隐式转换与隐式参数(18)

Scala:从泛型类型到第二泛型类型的隐式转换