黑猴子的家:Scala 隐式转换

1、隐式转换简述

所谓隐式转换函数(implicit conversion function)指的是那种以implicit关键字声明的带有单个参数的函数。正如它的名称所表达的那样,这样的函数将被自动应用,将值从一种类型转换为另一种类型。

我们可以给转换函数起任何名称。由于我们并不显式地调用它,因此,你可能会想用较短的名称,比如i2f,不过,我们有时候也会有需要,显式地引入转换函数。因此我建议,我们应坚持使用source2Target这种约定俗成的命名方式

Scala并不是第一个允许程序员提供自动类型转换的语言。不过,Scala给了程序员相当大的控制权在什么时候应用这些转换。我们将讨论隐式转换究竟在什么时候发生,以及如何微调这个过程

尽管Scala提供了微调隐式转换的工具,语言的设计者们也意识到隐式转换可能有潜在的问题。为了避免在使用隐式函数时出现警告,我们可以添加
import scala.language.implicitConversions 语句或编译器选项
-language:implicitConversions.

在C++中,你可以以单参数构造器或者名为operator Type()的成员函数来指定隐式转换。不过,在C++中,你无法有选择地允许或禁止这些函数,因而得到不想要的转换时常有的事。

2、案例一

object ImplicitSyllabus {
    def main(args: Array[String]): Unit = {
        //不要出现二义性
        implicit def a(d:Double) = d.toInt
        //不加上,上边这句,试一试
        val i1:Int = 3.5
        println(i1)
    }
}

Scala

def b(d:Double) = {}
b(10f)

Java

public class Test{
    public static void test1(double x){

    }
    public static void main(String[] args){
        test1(10)
    }
}

在Java 和Scala 中,自动进行了转换,但是在隐式转换的时候,它不会跟你玩那些虚的,是什么类型就是什么类型

3、案例二

object ImplicitSyllabus {
  def main(args: Array[String]): Unit = {
    def a1(implicit x: Int) = {
      x
    }

    implicit val aa: Int = 6
    println(a1)
  }
}

转载于:https://www.jianshu.com/p/d730bcb35155

猜你喜欢

转载自blog.csdn.net/weixin_33938733/article/details/91182532