大家好,我是百思不得小赵。
创作时间:2022 年 8 月 8 日 博客主页: 🔍点此进入博客主页 —— 新时代的农民工 🙊 —— 换一种思维逻辑去看待这个世界 👀
在Scala中有一种特殊的机制,当编译器第一次编译失败的时候,会在当前的环境中查找能让代码编译通过的方法,用于将类型进行转换,实现二次编译。
implicit
声明为隐式转换函数。implicit def convert(num: Int):MyRichInt = new MyRichInt(num)
举个栗子:
object Test_Implicit {
def main(args: Array[String]): Unit = {
// 隐式函数
implicit def convert(num: Int):MyRichInt = new MyRichInt(num)
println(12.myMax(16))
}
}
// 自定义类
class MyRichInt(val self: Int) {
// 自定义比较大小的方法
def myMax(n: Int): Int = if (n < self) self else n
def myMain(n: Int): Int = if (n < self) n else self
}
普通方法或者函数中的参数可以通过 implicit
关键字声明为隐式参数,调用该方法时,就可以传入该参数,编译器会在相应的作用域寻找符合条件的隐式值。
说明:
举个栗子:
implicit val str: String = "alice"
implicit val num: Int = 12
def sayHello(implicit name: String) :Unit={
println(" hello, " + name)
}
sayHello
// 简便写法
def hiAge(): Unit={
println("hi, " + implicitly[Int])
}
hiAge()
在 Scala2.10
后提供了隐式类,可以使用 implicit
声明类,隐式类的非常强大,同样可以扩展类的功能,在集合中隐式类会发挥重要的作用。
说明:
举个栗子:
// 隐式类
implicit class MyRichInt2(val self: Int) {
// 自定义比较大小的方法
def myMax2(n: Int): Int = if (n < self) self else n
def myMain2(n: Int): Int = if (n < self) n else self
}
println(12.myMax2(16))
作用域:
说明:
[TypeList],
定义和使用都是。+-
表示协变和逆变,不加则是不变。语法:
class MyList[+T]{ } //协变
class MyList[-T]{ } //逆变
class MyList[T] //不变
举个栗子:
object Test_Generics {
def main(args: Array[String]): Unit = {
// 协变和逆变
val child: Parent = new Child
val childList: MyCollection[Parent] =new MyCollection[Child]
// val childList1: MyCollection[SubChild] =new MyCollection[Child]
}
}
class Parent{}
class Child extends Parent{}
class SubChild extends Child{}
// 定义带泛型的集合类型
class MyCollection[+E] {}
说明:
比如Son
和Father
是父子关系,Son
是子类。
(Covariance)
:MyList[Son]是MyList[Father]的子类,协同变化。(Contravariance)
:MyList[Son]是MyList[Father]的父类,逆向变化。(Invariant)
:MyList[Father] MyList[Son]没有父子关系。举个栗子:
object Test03_Generics {
def main(args: Array[String]): Unit = {
// 上下限
def test[A <:Child](a: A)={
println(a.getClass.getName)
}
test[Child](new Child)
test[SubChild](new SubChild)
test[Child](new SubChild)
}
}
class Parent{}
class Child extends Parent{}
class SubChild extends Child{}
// 定义带泛型的集合类型
class MyCollection[+E] {}
本次分享的内容到这里就结束了,整个Scala专栏的总结也随之告一段路,希望对大家学习Scala有所帮助!!