Scala隐式对象与隐式类详解及使用技巧
时间:2026-08-14 | 作者:多维游侠 | 阅读:0一,隐式对象
所谓隐式对象,本质上就是一个用implicit关键字声明的单例对象。它的主要作用,是为某种类型提供实例,方便在隐式转换场景中直接使用。很多时候,它也会被拿来把某个类或trait的实例,以隐式方式注入到方法里。
package imp
/*
*
* 背景:已有一个写好的类,要求在不修改这个类的源代码的情况下,拓展这个类的新功能
*
* 思路:
* 1,补充定义一个新类,在这个新类中提供新方法
* 2,提供一个隐式转换函数,把之前旧类对象转换成这个新类对象
*/
object imp05 {
class User() {
def insertUser():Unit = {
println("insertUser......")
}
}
class UserStrong() {
def updateUser():Unit={
println("ipdateUser......")
}
}
implicit def xxxxx(user: User):UserStrong={
println("自动调用隐式转换函数......")
new UserStrong
}
def main(args: Array[String]): Unit = {
val u1 = new User()
u1.insertUser()
u1.updateUser()
}
}隐式类
眼下有一个已经存在的类。现在要在它原有能力的基础上继续扩展,额外加上一个方法。可前提也很明确:不能直接去改动这个类本身的代码。
package imp
/*
*
* 背景:已有一个写好的类,要求在不修改这个类的源代码的情况下,拓展这个类的新功能
*
* 思路:
* 1,补充定义一个新类,在这个新类中提供新方法
* 2,提供一个隐式转换函数,把之前旧类对象转换成这个新类对象
*
* 隐式类
* implicit class
*
* 作用:在不修改原来类的基础之后,增加新的功能。
*/
object imp05 {
class User() {
def insertUser():Unit = {
println("insertUser......")
}
}
implicit class UserStrong(user: User) {
def updateUser():Unit={
println("ipdateUser......")
}
}
def main(args: Array[String]): Unit = {
val u1 = new User()
u1.insertUser()
u1.updateUser()
}
}二,案例:验证字符串是否合法
package imp
/*
*
* 目标:让任意一个字符串具备一个功能:判断是否是一个合法的手机号
*
* String类是系统提供的,并没有isphone这个方法
* 现在就要去在不修改string类的情况下,增加这个方法
*/
object imp06 {
implicit class StrongString(s:String) {
def isPhone:Boolean = {
val reg = "^1[35678]d{9}$".r
reg.matches(s)
}
def isIDCard:Boolean = {
val reg = "^d{17}[dXx]$".r
reg.matches(s)
}
}
def main(args: Array[String]): Unit = {
val str = new String("13036197649")
//val str = "13036197649"
//str.isPhone()//判断自己是否是一个合法的手机号,返回值是boolean。true。false
println(str.isPhone)
println("1303456754a".isPhone)
println("1304595462a".isPhone)
println("421055202110223143".isIDCard)// true
println("40900520211022135a".isIDCard)//false
}
}三,计算阶乘
目标:让任意一个整数具备一个功能:计算阶乘
n! = 1293...*n
5!=1 * 2 * 3 * 4 * 5 =120
package imp
import scala.language.postfixOps
/*
*
* 目标:让任意一个整数具备一个功能:计算阶乘
* n! = 1*293*...*n
* 5!=1 * 2 * 3 * 4 * 5 =120
*/
object imp07 {
implicit class StrongInt(n: Int) {
def ! : Int = {
var rst = 1
// Scala中循环的正确写法是“i <- 1 to n”
for (i <- 1 to n) {
rst *= i
}
rst
}
}
def main(args: Array[String]): Unit = {
println(4!)
println(5!)
}
}
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 迅捷路由器怎么调信号最强,设置时要注意什么?
- 时间:2026-08-27
-
- vivo浏览器怎么卸不掉?原因和解决方法在这里
- 时间:2026-08-27
-
- OPPO R11s黑屏了,怎么强制恢复出厂设置?
- 时间:2026-08-27
-
- 飞利浦显示器包装盒有生产日期和保修期吗?怎么看?
- 时间:2026-08-27
-
- 联想新平板开机必须联网吗?怎么做?
- 时间:2026-08-27
-
- 平板横竖屏切换设置与问题解决
- 时间:2026-08-27
-
- 移动电源容量怎么测?要准备哪些工具?
- 时间:2026-08-27
-
- 荣耀90 Pro防水吗?防水级别多少?怎么用才安全
- 时间:2026-08-27
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15
