博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Scala学习(四)
阅读量:5807 次
发布时间:2019-06-18

本文共 2057 字,大约阅读时间需要 6 分钟。

hot3.png

抽象类定义:abstract class Element{ def contents:Array[String]; def height = contents.length}

定义无参数方法:如果仅提供对象的某个数据的访问(没有副作用的方法),那么久省略括号。定义成无参数方法。

如果无参数方法用用到的地方较多并且比较频繁,建议把无参数方法def height = contents.length变成val height = 

contents.length的字段值。两者的区别是:因为字段值在类初始化的时候被预编译,而方法调用在每次调用的时候都需要计算,

另一方面,使用字段需要为每个Element对象分配更多空间。所以用无参数方法还是字段值看情况而定。

在scala中字段和方法属于相同的命名空间。这让字段可以重写无参数方法。

class WontCompile{ private var f = 0; def f = 1;}//编译无妨通过,因为字段和方法重名了。

java为定义准备了4个命名空间(分别是字段,方法,类,包),scala仅有2个命名空间(值(字段,方法,包,单例对象),类型(类和特质名))

implicit基本含义

在Scala中有一个关键字是implicit

我们先来看一个例子:

def display(input:String):Unit = println(input)

我们可以看到,display函数的定义只是接受String类型的入参,因此调用display("any string")这样的函数是没问题的。但是如果调用display(1)这样的入参不是String类型的话,编译会出错的。

如果我们想让display函数也能够支持Int类型的入参的话,除了我们重新定一个def display(input:Int):Unit = println(input)这样的函数以外,我们还可以在相同的作用域内用implicit关键字定义一个隐式转换函数,示例代码如下:

object ImplicitDemo {  def display(input:String):Unit = println(input)  implicit def typeConvertor(input:Int):String = input.toString  implicit def typeConvertor(input:Boolean):String = if(input) "true" else "false"//  implicit def booleanTypeConvertor(input:Boolean):String = if(input) "true" else "false"  def main(args: Array[String]): Unit = {    display("1212")    display(12)    display(true)  }}

我们定义了2个隐式转换函数:

  implicit def typeConvertor(input:Int):String = input.toString  implicit def typeConvertor(input:Boolean):String = if(input) "true" else "false"

这样display函数就可以接受String、Int、Boolean类型的入参了。注意到上面我们的例子中注释的那一行,如果去掉注释的那一行的话,会在运行的时候出现二义性:

Error:(18, 13) type mismatch; found   : Boolean(true) required: StringNote that implicit conversions are not applicable because they are ambiguous: both method typeConvertor in object ImplicitDemo of type (input: Boolean)String and method booleanTypeConvertor in object ImplicitDemo of type (input: Boolean)String are possible conversion functions from Boolean(true) to String    display(true)            ^

得出的结论是:

  1. 记住隐式转换函数的同一个scop中不能存在参数和返回值完全相同的2个implicit函数。

  2. 隐式转换函数只在意 输入类型,返回类型。

  3. 隐式转换是scala的语法灵活和简洁的重要组成部分

转载于:https://my.oschina.net/u/2300159/blog/516367

你可能感兴趣的文章
【ros】Create a ROS package:package dependencies报错
查看>>
从内积的观点来看线性方程组
查看>>
kali linux 更新问题
查看>>
HDU1576 A/B【扩展欧几里得算法】
查看>>
廖雪峰javascript教程学习记录
查看>>
WebApi系列~目录
查看>>
限制CheckBoxList控件只能单选
查看>>
Java访问文件夹中文件的递归遍历代码Demo
查看>>
项目笔记:测试类的编写
查看>>
如何迅速分析出系统CPU的瓶颈在哪里?
查看>>
通过容器编排和服务网格来改进Java微服务的可测性
查看>>
re:Invent解读:没想到你是这样的AWS
查看>>
PyTips 0x02 - Python 中的函数式编程
查看>>
阿里云安全肖力:安全基础建设是企业数字化转型的基石 ...
查看>>
使用《Deep Image Prior》来做图像复原
查看>>
如何用纯 CSS 为母亲节创作一颗像素画风格的爱心
查看>>
Linux基础命令---rmdir
查看>>
优秀程序员共有的7种优秀编程习惯
查看>>
iOS sqlite3(数据库)
查看>>
粤出"飞龙",打造新制造广东样本
查看>>