変位指定付きの型のオブジェクトを 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 になった。