java隐式参数的作用_隐式参数_scala教程_田守枝Java技术博客
所谓隐式参数指的是,我们的函数或者方法中的参数可以有隐式值,或者说是默认值。通过提供隐式参数,我们在调用函数的时候,可以不提供参数,scala会自动去查找隐式值,当然隐式值也是需要我们提供的。
在Scala中,如果我们的方法定义的参数列表以implicit开头,则方法参数列表中的参数都是隐式参数。在提供了隐式值的情况下,我们调用方法时,不需要提供参数。
1、入门案例object ImplicitDemo {
//隐式值
implicit val xx: String = "tianshouzhi"
implicit val yy: Int = 25
//隐式参数
def test(implicit name: String, age: Int) {
println("name:" + name + ",age:" + age)
}
def main(args: Array[String]): Unit = {
test//注意没有携带参数
}
}
运行程序的结果为:name:tianshouzhi,age:25
可以看到了,方法的参数列表加了implicit之后,会自动查找隐式值,隐式值同样以implicit开头。
2、Scala是如何为隐式参数提供隐式值的?
Scala是通过类型检查来为隐式参数提供默认值。因为在test方法中的参数,一个是String类型,一个是Int类型,而我们提供的2个隐式值分别为implicit val xx: String = "tianshouzhi" //String类型
implicit val yy: Int = 25 //Int类型
因为提供的隐式值类型刚好能匹配上,因此调用的时候可以不传递参数。
此外,需要注意的是, 因为是按照类型进行匹配的。所以隐式参数列表中相同类型的参数,都会被赋予同样的值。例如,我们修改test方法//增加address参数
def test(implicit name: String, age: Int,address:String) {
println("name:" + name + ",age:" + age+",address:"+address)
}
修改后的方法有2个String类型的参数,而隐式值是按照参数类型进行匹配的,因此这两个String类型的参数的隐式值都是"tianshouzhi"。
读者可以运行程序进行测试name:tianshouzhi,age:25,address:tianshouzhi
如果隐式参数列表中,只要有一个参数没有默认值,那么我们在调用的时候,就必须要传递所有的参数。假设,一个方法接受五个不同的类型的隐式参数,即使我们提供了4种类型的隐式值,因为还有一种类型没有隐式值,我们在调用函数的时候也需要提供所有的参数。
那么如果我们只能提供参数列表中部分的隐式值。但是又只想提供没有隐式值的那个类型的参数,改怎么办?此时应该使用柯里化函数。如object ImplicitDemo {
//隐式值
// implicit val xx: String = "tianshouzhi"
implicit val yy: Int = 25
//隐式参数
def test( name: String)(implicit age:Int){
println("name:" + name + ",age:" + age)
}
def main(args: Array[String]): Unit = {
test("tianshouzhi")
}
}
需要注意的是,柯里化后的函数,必须要将不能提供隐式值的参数,放到方法的参数声明的最前面。以下的这种声明方式是错误的//隐式参数
def test(implicit age:Int)( name: String){
println("name:" + name + ",age:" + age)
}
因为违反了规定,name没有隐式值,确放到了方法参数的列表的最后面。
java隐式参数的作用_隐式参数_scala教程_田守枝Java技术博客相关推荐
- java jta_JTA规范_分布式事务教程_田守枝Java技术博客
JTA规范事务模型 Java事务API(JTA:Java Transaction API)和它的同胞Java事务服务(JTS:Java Transaction Service),为J2EE平台提供了分 ...
- hive java udf_UDF_Hive教程_田守枝Java技术博客
UDF是User-Defined Functions(用户定义函数)的简称. 通过以下命令可以查看HIVE中函数的相关文档:SHOW FUNCTIONS; DESCRIBE FUNCTION ; DE ...
- 鸿蒙安装elasticsearch7,安装操作系统_岁寒,然后知松柏之后凋也的技术博客_51CTO博客...
安装操作系统 了解了主流操作系统后,我们就要开始进入学习之中了,而学习之前,首先得做的就是安装操作系统 接下来就开始进行操作系统安装的步骤吧 linux操作系统安装有两种方式 1.文本安装 优点:可以 ...
- 视频教程-大型Java项目视频教程_王勇老师DRP项目教程完整版292集-Java
大型Java项目视频教程_王勇老师DRP项目教程完整版292集 动力节点王勇老师,CCTV<影响力对话>栏目特约嘉宾,Java培训知名讲师,中国Java培训领军人物,北京动力节点创始人,董 ...
- java web论文_(定稿)毕业论文基于JavaWeb技术博客项目的设计论文(完整版)最新版...
<[毕业论文]基于Java Web技术博客项目的设计论文.doc>由会员分享,可免费在线阅读全文,更多与<(定稿)毕业论文基于Java Web技术博客项目的设计论文(完整版)> ...
- python脚本监控网站状态 - 赵海华_运维之路 - 51CTO技术博客
python脚本监控网站状态 - 赵海华_运维之路 - 51CTO技术博客 python脚本监控网站状态 2013-01-09 09:21:02 标签:监控 python 原创作品,允许转载,转载时请 ...
- 用开源博客系统OneBlog来搭建自己的个人技术博客网站(java版博客系统)
java版博客系统 一直想搭建一个个人的博客,方便记录和分享一些技术点,在网上也找了一圈,最终在开源中国中发现了一款很不错的java版的博客系统 https://gitee.com/yadong.zh ...
- python自我总结笔记、加上一些自己思考_写技术博客那点事(此篇文章 鼓励自己 多思考 多学习 多做 )...
前言 写文章是一个短期收益少,长期收益很大的一件事情,人们总是高估短期收益,低估长期收益.往往是很多人坚持不下来,特别是写文章的初期,刚写完文章没有人阅读会有一种挫败感,影响了后期创作. 从某种意义上 ...
- 响应式瀑布流布局新闻资讯技术博客织梦模板/DedeCMS自适应手机版游戏新闻网站源码下载
响应式瀑布流布局新闻资讯技术博客织梦模板,DedeCMS自适应手机版游戏新闻网站源码下载.本套织梦模板采用织梦最新内核开发的模板,这款模板使用范围广,不仅仅局限于一类型的企业,游戏新闻.游戏博客类的网 ...
- 海尔微型计算机一键还原怎么操作,电脑的一键还原在哪_电脑一键还原详细教程_电脑一键还原怎么操作...
电脑的一键还原在哪_电脑一键还原详细教程_电脑一键还原怎么操作 电脑的一键还原在哪?这个问题是很多小伙伴都想知道的,电脑是可以自己一键还原的,但是很多小伙伴都不太清楚,那么小编来告诉大家吧. (1)一 ...
最新文章
- 独立服务器和虚拟服务器的区别,BlueHost虚拟主机与独立服务器的主要区别
- 【Linux系统编程】线程的基本操作
- 安卓拒绝服务漏洞分析及漏洞检测
- jQuery基础学习笔记(上)
- 《Python编程快速上手——让繁琐工作自动化》——2.5 控制流的元素
- 为什么你的店铺不赚钱?
- 历史chrome(离线)版本下载
- 从github安装C++库,makefile、
- 阿里巴巴实习生 招聘内推
- c语言中实现阶乘的方法,c语言实现阶乘的方法
- 支付宝对账单功能开发
- 黎曼ζ(2)的导数:ζ'(2)=-1
- 免费Web 托管公司遭黑客攻击 1350万用户数据泄露
- matlab怎么实现行随机网络,matlab生成随机行走网格 模拟材料生长 - 计算模拟 - 小木虫 - 学术 科研 互动社区...
- 【SAP GUI Scripting】 入门系列(1)_基本设置
- Dan Pitt卸任ONF执行董事
- Python项目实战:各种小说姓名生成器
- centos 6.5安装步骤
- GD32W515系列Wi-Fi MCU资料
- node.js ajax语法
热门文章
- 计蒜客-----泥塑课(set)
- 蓝牙打印 设置打印样式_双编辑模式 打印自由更轻松!——海鸟贴纸打印机蓝牙按键版体验...
- 流水灯程序 keil_天问51学习笔记(3):8个任务的uCOS II程序框架
- java定时发送_Java 定时发送邮件 | 学步园
- php7类型约束,类型约束 - PHP 7 中文文档
- 算法: 最大正方形面积221. Maximal Square
- 不能忽视的情绪 -- 喜怒哀惧,也不过度关注
- Google Code Review代码审查标准
- 算法:Design Circular Deque(设计一个双端队列)
- linux环境安装ffmepg,Linux centOS下安装FFmpeg