scala高级类型

本文探讨Scala中单例类型的使用方式,介绍如何通过设置方法返回类型为this.type实现链式调用;讲解类型投影的概念及应用,解决不同网络成员间的联系问题;并展示类型别名的定义与运用。

1.单例类型
给定任何引用v,你可以得到类型v.type,他有两个可能值:V和Null。用法看一个返回this的例子。

class Document{
    def setAuthor(author:String) = this
    def setTitle(title:String) = this
}

class Book extends Document {
    def addChapter(chapter:String) = this
}

    val doc = new Document
    val book = new Book
    doc.setAuthor("author").setTitle("scala")
//  由于setTitle默认返回Document对象,所有不能使用addChapter()
//  book.setAuthor("author").setTitle("scala").addChapter("chapter1") 

解决方法是声明setTitle的返回类型为this.type

class Document{
    def setAuthor(author:String):this.type = this
    def setTitle(title:String):this.type = this
}
//这次可以使用addChapter方法了
book.setAuthor("author").setTitle("scala").addChapter("chapter1") 

2.类型投影
下面有个网络类,但是他们的内部类不同相同子类,因此不能使用contacts连接,
但将其定义为更为松散的类,可以使用类型投影Network#Member

class Network{
    private val members = new ArrayBuffer[Member]
    class Member(val name:String) {
        //val contacts = new ArrayBuffer[Member]//不同网络的Member对象不是同一种类型
        val contacts = new ArrayBuffer[Network#Member]
    }

    def join(name:String) = {
        val m = new Member(name)
        members += m
        m
    }
}

    val chatter = new Network
    val myface = new Network
    val fred = chatter.join("fred")
    val barney = myface.join("barney")
//  这里的Member不是同一个类型 使用类型投影Network#Member之后,意思是任何Network的Member
    fred.contacts += barney

3.类型别名

    import collection.mutable._
    type Index = HashMap[String,(Int,Int)]
    val a = new Index // a的类型为: HashMap[String, (Int, Int)]
    a += ("abc" -> (1,2))
    a += ("abc1" -> (3,4))
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值