1 定义
隐式类指的是用implicit关键字修饰的类。在对应的作用域内,带有这个关键字的类的主构造函数可用于隐式转换。
2示例
现在有一个需求:有一个 Person 类,含有work()方法,有一个 Student 类,含有study()方法,在不使用继承的情况下,要求创建一个Person类的对象,可以直接调用Student类里的study()方法?
方法①: 使用 隐式类 ,将Student类定义为隐式类,这样在 new Person对象的时候, 编译器会默认在Student的主构造方法中传入Person对象,再转型为Student对象,这样新建的Person对象就有了双重身份,可以随便调用这两个类中的方法
代码如下:
创建一个scala class文件: Person
class Person() {
def work()={
println("人每天都要工作")
}
}
object Test1{
implicit class Student(obj:Person){
def study()={ //重点:主构造方法传入的类型必须要有-----> Person
println("喜欢学习scala")
}
}
def main(args: Array[String]): Unit = {
val person: Person = new Person
person.work()
person.study()
}
}
1
注:
创建隐式类,主构造函数中必须要引入一个目标类当参数,且隐式类必须要在 object 中创建
本文是将隐式类与目标类写在了一个scala文件中,当隐式类写在其他文件中,调用时引入该隐式类所在的包即可
方法②: 使用 隐式函数 转换,创建Person对象时,编译器默认会将Person对象转为Student对象,从而使得新建的Person对象有了双重身份,可以随便调用这两个类中的方法
代码如下:
创建一个scala class文件: Person
class Person() {
def work()={
println("人每天都要工作")
}
}
class Student(){
def study()={
println("喜欢学习scala")
}
}
object Test1{
//重点:定义一个隐式函数,将 Person 转为 Student
implicit def personToStudent(obj:Person):Student = new Student
def main(args: Array[String]): Unit = {
val person: Person = new Person
person.work()
person.study()
}
}
注:
使用隐式函数,Studnet类只需定义为一个普通类即可
Person类可以使用多个隐式函数转型,从而使用其他类中的方法