隐式对象
隐式对象是一个带有implicit关键字的单例对象,它可以用于提供某种类型的实例以供隐式转换使用。隐式对象通常用于将某个类或trait的实例隐式地注入到方法中。
隐式对象和前面讲的隐式参数比较类似,都是用来设置初始数据的。
隐式类
背景:有一个现有的类,它有一个方法。现在我们需要对这个类的功能进行拓展,额外补充一个方法。但是,不允许直接修改原来的类的代码。
假设这里有一个类User,它的内部有一个方法 insertUser
基本代码:
package imp
/**
* 隐式类
*
* 背景:有一个现成的类,它有一个方法。我们现在需要对这个类的功能进行拓展:额外补充一个新方法。
* 但是:不允许直接修改原来的类的代码。
*
* 思路:
* 1.补充一个新的类,把这个新的方法写到这个类中。
* 2.补充一个隐私转换函数,把这个旧类转换成这个新类。
*
* 隐式类
* 1. class前面加implicit
* 2.入参就是要拓展功能的那个对象
*/
object imp04 {
class User {
def insertUser(): Unit = {
println("添加一个新用户.....")
}
}
implicit class UserExt(user:User){
def updateUser():Unit={
println("修改用户.....")
}
}
// implicit def XXX(user:User):UserExt={
// new UserExt
// }
def main(args: Array[String]): Unit = {
val u1=new User()
u1.insertUser()
u1.updateUser()
}
}
案例:验证手机号是否合法?
package imp
/**
*需求:
* 让所有字符串都具备一个功能:检查自己是不是一个合法的手机号码?
*
* 1. 目前的字符串类是没有这个功能的。
*
* 2. 拓展String这个类
*/
object imp05 {
// 让所有的String对象,都有了一个新的方法 isPhone!
implicit class StrongString(s:String) {
def isPhone():Boolean={
val reg="^1[356789]\d{9}$".r
reg.matches(s)
}
}
def main(args: Array[String]): Unit = {
val str=new String("13678892476")
var str1="abcdaabfghfs"
// 判断自己是否是一个手机号
if(str.isPhone){
println(s"${str}是手机号")
}else{
println(s"${str}不是手机号")
}
}
}
案例:计算阶乘
package imp
import scala.language.postfixOps
/**
*需求:
* 让所有整数都具备一个功能:计算阶乘。
*n!=1*2*3*4....*n
* 1. 目前的字符串类是没有这个功能的。
*
* 2. 拓展String这个类
*/
object imp06 {
implicit class StrongInt(n:Int) {
def !():Int={
// println("阶乘....")
var s=1
for(i <- 1 to n){
s *=i
}
s
}
}
def main(args: Array[String]): Unit = {
val k=5;// 5*4*3*2*1=120
// 计算k的阶乘
println(s"${k}的阶乘是:${k!}")
}
}