【Scala 19】functionインパラメータ型逆変換について、結果コヒーレンスを返す

888 ワード

class CSuper {

}

class C extends CSuper {

}

class C2 extends  CSuper {

}

class CSub  extends  C {

}

object Scala8 {

  /***
    * 
    * @return
    */
    val func1 : C=>C = (c : CSuper) => new CSub
    val func2 : C=>C = (c : C) => new C
    //val func3: C=>C = (c: CSub) => new C
    //val fun4:C=>C = (c:C2)=>new C
     def main(args : Array[String]): Unit = {
     }
}

 
func 1の戻り値がC=>Cであるため、func 1()(XXX)では、XXXはCまたはCのサブタイプでなければならず、CまたはCのサブタイプは必然的にCSuperに変換することができ、すなわち、XXXオブジェクトは(c:CSuper)=>new CStubのパラメータとすることができる.
 
ただしXXXオブジェクトはCSubまたはC 2に変換できないためfunc 3,func 4はコンパイルエラーがある
 
fun 1,func 2はいずれも関数の(一意の)パラメータがインバータであり,戻り値がコヒーレントである関数数値面量である関数数値面量である.
 
val func1 : C=>C = (c : CSuper) => new CSub
以上のようにfunc 1の宣言タイプはC=>Cであり、実際に定義されたタイプは(c:CSuper)=>new CSubである