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

The specification is unsound; see https://issues.scala-lang.org/browse/SI-7278 among others.

于 2013-09-26T14:35:47.777 回答
2

这是类型检查器的限制,但它是合理的。考虑一下你要求它证明什么TB <: A#T:有一些A(我们称之为C)的子类,TB <: C#T并且C#T是具体的。存在这样的子类(即B),但我们是否一定希望编译器搜索A的整个层次结构才能找到它?

于 2013-09-24T17:47:12.293 回答