類型投影
類型投影的目的是將外部類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
其實我覺得這內容不常用的樣子 -_-!