3

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 型チェッカーの制限ですか、それとも何か不足していますか?

4

2 に答える 2

2

これは型チェッカーの制限ですが、妥当なものです。それを示すために証明するように求めていることを考えてみてください:とが具体的である( と呼びましょう)のTB <: A#Tサブクラスがあること。そのようなサブクラスが存在します (つまり、ACTB <: C#TC#TBA

于 2013-09-24T17:47:12.293 に答える
2

仕様は不健全です。特にhttps://issues.scala-lang.org/browse/SI-7278を参照してください。

于 2013-09-26T14:35:47.777 に答える