ラベル 変位指定 の投稿を表示しています。 すべての投稿を表示
ラベル 変位指定 の投稿を表示しています。 すべての投稿を表示
このページの記事一覧
● 2012年7月21日土曜日 - [Scala] 変位指定と isInstanceOf
● 2012年7月19日木曜日 - [Scala] 変位指定: 共変、反変、非変

2012年7月21日土曜日

[Scala] 変位指定と isInstanceOf

前回の 変位指定 の続き。
変位指定付きの型のオブジェクトを isInstanceOf[ T ] で検査した場合の挙動を確認しておこう。

まずは共変から。

object VarianceSample {
  def main(args : Array[String]) {
    var covariantStr : Covariantable[String] = new Covariantable[String];
    var covariantAny : Covariantable[AnyRef] = new Covariantable[AnyRef];

    println(
       "Covariantable[String] is instance of Covariantable[AnyRef]: " 
        + covariantStr.isInstanceOf[Covariantable[AnyRef]]);

    println(
        "Covariantable[AnyRef] is instance of Covariantable[String]: " 
        + covariantAny.isInstanceOf[Covariantable[String]]);
  }
}

class Covariantable[+R] {
  def hoge(): R = null.asInstanceOf[R];
}


Covariantable[String] is instance of Covariantable[AnyRef]: true Covariantable[AnyRef] is instance of Covariantable[String]: true

あれ?
共変なので、[String] is instance of [AnyRef] は true でも反対は false と思ったのだが、 両方とも true になった。

2012年7月19日木曜日

[Scala] 変位指定: 共変、反変、非変

Scala のコードを見ているとよくこんなコードに当たる。

trait Traversable[+A] extends TraversableLike[A, Traversable[A]] ...

この +A ってなんだろう。ジェネリクスの指定関係だということはわかるのだが。
調べてみたら、共変、反変、非変というジェネリクスの性質を指定するもののようだ。