在意想不到的地方需要施放

时间:2013-09-23 19:41:14

标签: scala types

在我需要使用演员表时,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类型检查器的限制还是我缺少的东西?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)