Scala入门小纸条(4)

本文详细介绍了Scala编程中的一些核心概念和技术,包括XML处理、类型系统、泛型、类型界定、函数式编程、actor模型、隐式转换以及延续。内容涵盖了Scala的特性,如XML的RuleTransformer类、类型参数、命名空间、类型界定与上下文界定、泛型的协变与逆变、存在类型、结构类型、类型投影、类型别名以及解析器库的使用。此外,还探讨了actor模型的原理和实践,如消息处理、线程模型、异常处理以及actor的生命周期。最后,文章提到了Scala的隐式转换和控制流转机制,如延续的使用和控制流转换。通过对这些主题的深入探讨,读者可以对Scala编程有更全面的理解。
摘要由CSDN通过智能技术生成

301. scala的xml提供了RuleTransformer类,将一个或多个RewriteRule实例应用到某个节点及其后代,需要重写transform方法;可以在RuleTransformer构造器中给出多个规则,会遍历所有后代,应用所有规则,返回经过变换的树

302. 用XML.loadFile来加载文档;也可以从InputStream、URL、Reader加载,用XML.load;其中文档是用java标准库的SAX解析的;scala还提供了ConstructingParser解析器用于保留注释、CDATA和空白;ConstructingParser的document方法返回一个Document,调用docElem可取得文档根节点;ConstructingParser默认不解析实体,而是转换成无用的注释;可以用XhtmlParser读取XHTML文件;要保存xml到文件,可以用XML.save方法,参数有enc、xmlDecl、doctype;还可以用XML.write保存到java.io.Writer;XML的排版美观用PrettyPrinter

303. xml中用xmlns属性声明命名空间,其中xml的命名空间是一个URI或URL;xml的元素后代也可以引入自己的命名空间;scala中每个元素有scope属性,类型为NamespaceBinding;命名空间前缀的做法允许混用多个命名空间的元素,比如xmlns:svg="http://..."定义后,svg就是前缀名,以svg:开头的元素都属于该命名空间

304. scala可以使用类型参数实现类和函数,为的是可以用于多种类型;scala的类、特质、方法和函数都可以有类型参数,它们放在名称之后,用方括号括起来,如Array[T]

305. 类型界定的语法为T<:UpperBound、T>:LowerBound、T<%ViewBound、T:ContextBound

306. 可以用类型约束来约束一个方法,如(implicit ev:T<:<UpperBound)

307. 用+T(协变)来表示某个泛型类的子类型关系和参数T方向一致,或用-T(逆变)表示方向相反

308. 协变适用于表示输出的类型参数,比如不可变集合中的元素;逆变适用于表示输入的类型参数,比如函数参数

309. 把泛型类Pair[T]的T改为T<:Comparable[T],就可以使用first.compareTo(second)方法了,因为它表明T必须是Comparable[T]的子类型;根据以上,我们可以实例化Pair[String],但不能实例化Pair[File],因为File不符合子类型的要求

310. 定义def ReplaceFirst[R>:T](newFirst :R)=new Pair[R](newFirst,second),就可以用超类来替换原类型,比如Person替换Student;如果不写上界,可以通过编译,但会返回Pair[Any]

311. 和java的Integer不同,scala的Int没有实现Comparable,但RichInt实现了,还有一个Int到RichInt的隐式转换,可以用“视图界定”,即T<%Comparable[T],表示T可以被隐式转换为Comparable[T]

312. 用Ordered特质更好,它在Comparable基础上额外提供了关系操作符,用法为T<%Ordered[T],就可以直接写first<second了;java的String没有实现Ordered特质,但它可以被隐式转换成RichString,后者实现了Ordered

313. 上下文界定是T:M,其中M是另一个泛型类,要求存在一个类型为M[T]的隐式值,而隐式值比隐式转换更灵活

314. 要实例化一个泛型的Array[T],需要一个Manifest[T]对象,这是scala中想让基本类型数组正常工作所必须的,例如def makePair[T:Manifest](first:T,second:T), 因为scala的Array[Int]在jvm的本质是int[],而Array只是一个普通类,此时要实现泛型数组,必须依赖Manifest对象来帮忙;当调用makePair(4,9)实际上会定位到隐式的Manifest[Int]然后调用makePair(4,9)(intManifest),而其中new Array[T](2)也是调用new Array(2)(intManifest),得到int[2],之所以这么复杂是因为jvm中泛型相关的类型信息是被擦除的

315. Manifest上下文界定是scala内置的上下文界定具体实例!它被定义在Predef.scala中,即type Manifest[T]  = scala.reflect.Manifest[T],后者是一个特质,具体是trait Manifest[T] extends ClassManifest[T] with Equals

316. 类型变量可以同时有上界和下界,如T>:Lower<:Upper,但不能同时有多个上界或多个下界;也可以有多个视图界定,如T<%Comparable[T]<%String;也可以有多个上下文界定,如T:Ordering:Manifest

317. 类型约束提供另一个限定类型的方式,总共有三种包括T=:=U、T<:<U、T<%<U 分别测试T是否是U,T是否是U的子类型,T能否被视图隐式转换成U;要使用这个约束,需要添加隐式类型证明参数,如在类或方法后面追加(implicit ev: T<:<Comparable[T]);注意:这些约束并非内建在scala语言当中,而是scala库提供的特性

318. 类型约束让你可以在泛型类中定义只能在特定条件下使用的方法,例如可以构造Pair[File],尽管File没有实现Ordered特质,只有当你调用具体的方法,才会报错;另一个例子是Option类的orNull方法(orNull带有约束Null<:<A),在和java交互时很有用,但它不适用于值类型,比如Int,因为它们不把null看成是合法的值,但是你仍然可以实例化Option[Int],只要别使用orNull即可

319. 类型约束还可以改进类型推断,比如用def firstLast [A,C] (it:C) (implicit ev: C<:<Iterable[A])代替def firstLast[A,C<:Iterable[A]](it:C),这样执行firstLast(List(1,2,3))就不会报错[Nothing,List[Int]]不符合[A,C<:Iterable[A]]

320. class Pair[+T]表示该类型是与T协变的,它与T按照同样的方向型变,比如Student是Person的子类型,那么Pair[Student]也就是Pair[Person]的子类型; 逆变(如trait Friend[-T])是类型变化的方向和子类型方向是相反的,比如Student是Person的子类型,但Friend[Student]是Friend [Person]的超类型;可以同时使用两种型变,比如单参数函数类型为Function[-A, +R]

321. 对于某个对象消费的值适用逆变,对于它产生的值适用协变,前者指函数的参数,后者指函数的返回值;如果一个对象同时消费和产出某值,那类型应该保持不变,如scala数组是不支持型变的,比如不能将Array[Student]转换成Array[Person]或者反过来,因为会不安全

322. 对象无法添加类型参数,即对象不能泛型,比如object Empty[T] extends List[T]是错误的,正确做法是 object Empty extends List[Nothing],这里用到的知识点是,Nothing是一切类型的子类型,而List是协变的,因此List[Nothing]可转成List[Int]等List[T],所以Empty能转成一切List[T];但事实上经过我测试,这样也是不行的,报illegal inheritance from sealed class List,原因是List是sealed abstract class List[+A],即它是密封类,不能被扩展了,除非写到源文件中

323. java中所有泛型类都是不变的,可以使用通配符改变它们的类型&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值