Scala 隐式参数、隐式转换、多态方法

隐式参数


方法可以通过在参数列表开始处使用implicit关键字标识,表示方法的隐式参数列表。如果隐式参数列表的参数没有被正常传入,Scala将会查看其是否能够获取对应类型的隐含值,如果可以,将其自动传入。

Scala的搜索流程如下:

  • Scala首先会查找在具有隐式参数块的方法被调用的位置处可以直接访问(不需要前缀)的隐式定义与隐式参数。
  • 接着Scala会在所有伴侣对象中查找与隐式候选类型关联的被标记为implicit的成员。
class A(name:String){
    def getName:String = name
}

# 标识隐式成员
implicit val aaa = new A("aaaa")

# 使用隐式参数定义方法
def kkk(iii:String)(implicit a:A):Unit = {
    println(iii)
    println(a.getName)
}

# 调用使用隐式参数的方法
kkk("kkkkkkkk")

隐式转换


从类型S到类型T的隐式转换可以由具有函数类型S=>T的隐式值定义,或由可转化为此类型值的隐式方法定义。

隐式转化应用于两种情况:

  • 表达式e为类型S,并且类型S不符合表达式期待的类型T
  • 在类型S的e的选择e.m中,选择器m不表示S的成员

在第一种情况下,搜寻适合e,并且结果类型符合T的转换c。在第二种情况下,搜索适合e,并且结果包含名为m的成员的转化c。

由于不加选择地使用隐式转换可能会有陷阱,所以当编译到隐式转化时,编译器会发出警告。

可以通过以下方法之一关闭警告:

  • 在隐式转化定义处导入 scala.language.implicitConversions
  • 使用 -language:implicitConversions 调用编译器

编译器应用转化时不会发出警告。

多态方法


Scala中的方法可以按照值与类型进行参数化。语法类似于泛型类。类型参数放在方括号中,而值参数放在括号中。

# 定义方法(根据参数的值与类型可以表现出多态)
def listOfDuplicates[A](x: A, length: Int): List[A] = {
  if (length < 1)
    Nil
  else
    x :: listOfDuplicates(x, length - 1)
}

# 复制整数
println(listOfDuplicates[Int](3, 4)) 

# 复制字符串
println(listOfDuplicates("La", 8))  

ps:12::pp表示将12放入列表pp的左侧。
ps:类型参数可以省略,编译器可以通过上下文或者参数的类型将其推导出来。

翻译源:隐式参数

猜你喜欢

转载自blog.csdn.net/qq_32165041/article/details/83579773
今日推荐