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