Scala でキャストを使用する必要がある場合もありますが、厳密には必要ではありません。次のプログラムを検討してください。
abstract class A {
type T <: F[T]
}
abstract class F[T <: F[T]] {
def me: String
}
class B extends A {
type T = TB
}
class TB extends F[TB] {
def me = "It's me"
def you = "It's you"
}
trait Operator[S <: A] extends Function[S#T,String]
object f1 extends Operator[A] {
def apply(x: A#T) = x.me
}
object f2 extends Operator[B] {
def apply(x: B#T) = x.you
}
object Driver {
def main(args: Array[String]) {
val bi = new TB()
println(f1(bi.asInstanceOf[A#T]))
println(f2(bi))
}
}
メソッドで削除するasInstanceOf[A#T]
とmain
、コードはコンパイルされません。しかし、キャストは本当に必要だとは思いません。実際、生成されたバイトコードを で見ると、命令javap
の出現はありません。checkcast
これは Scala 型チェッカーの制限ですか、それとも何か不足していますか?