您的位置:首页 > 其它

Scala入门之高级类型:类型投影

2016-08-09 16:30 417 查看

类型投影

类型投影的目的是将外部类Outter中定义的方法def print(i:Inner)=i,它可以接受做任意外部类对象中的Inner类。格式是 Outter#Inner
直接看代码更容易理解


package com.dt.scala.moguyun

/**
* Created by hlf on 2016/8/9 for learn TypeProjection.
* 类型投影主要用在有外部类和内部类,并且外部类有方法是需要传入内部类作
* 参数的时候用的,而这个传入的参数要求除了可以是自己这个对象的内部类,
* 也可以是其他实例对象的内部类,只要都是实例化这个类就行了。
*/
object TypeProjection extends App{
val outter1 = new OutterClass
outter1.getName("电脑")
val inner1 = new outter1.InnerClass
inner1.getName("主机")
println(outter1)

val outter2 = new OutterClass
outter2.getName("洗衣机")
val inner2 = new outter2.InnerClass
inner2.getName("滚筒")
println(outter2)
println("==============无类型投影=================")
//如果我想把洗衣机的滚筒这个内部类放到电脑这里的getInner方法里
outter1.getInner(inner1)//放自己的没问题,也没意义的样子
//outter1.getInner(inner2)会报错,提示不匹配
println("==============类型投影=================")
outter1.getInner2(inner2)//新添加一个类型投影就可以了

}

/**
* 外部类,内部类其实是外部类的一个成员,不像JAVA一样
*/
class OutterClass{
outter =>
var name: String = _
def getName(getname: String): Unit ={
this.name = getname
}
def getInner(innerClass: InnerClass) = {
println("innerClass'name is " + innerClass.name)//调用内部类成员
println("I'm a " + name + "!!!I'm aloof")
}

def getInner2(innerClass: OutterClass#InnerClass) = {
println("innerClass'name is" + innerClass.name)//调用内部类成员
println("I'm a " + name + " !!!I'm aloof")
}

/**
* 内部类
*/
class InnerClass{
inner =>
var name: String = _
def getName(getname: String): Unit ={
this.name = getname
}
def say: Unit ={
println("outterClass is  " + outter.name)//调用外部类成员
print("I'm a Innerclass!!!I'm proud")
}
}
//这里想把内部类名字也写上的,但是水平有限调不出来 :(
override def toString: String = "outterClass is: " + name
}


运行结果
outterClass is: 电脑
outterClass is: 洗衣机
==============无类型投影=================
innerClass'name is 主机
I'm a 电脑!!!I'm aloof
==============类型投影=================
innerClass'name is滚筒
I'm a 电脑 !!!I'm aloof


其实我觉得这内容不常用的样子 -_-!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  scala