更新对象引用时,新参考中的方法是否可以访问?

时间:2014-04-13 20:52:06

标签: scala

在下面的代码中我将引用t从类型T更新为类型S.当我更新引用时,我应该无法访问类型S上的方法吗?在下面的代码中t.printS无法编译。

   object liskov {

  //if S is a subtype of T, then objects
  //of type T may be replaced with objects of type S
  class T {

    def printT() {
      println("T")
    }

  }

  class S extends T {

    def printS() {
      println("S")
    }
  }

  var t: T = new T                                //> t  : liskov.T = liskov$T@1e152c5
  var s: S = new S                                //> s  : liskov.S = liskov$S@80d1ff

  println(t)                                      //> liskov$T@1e152c5
  t = s
  println(t)                                      //> liskov$S@80d1ff
  s.printS                                        //> S
  t.printS

}

1 个答案:

答案 0 :(得分:0)

正如评论者所述,只有var t: T的静态类型可用于启用对t 成员的访问。但是,您可以轻松地创建动态类型查询,以区分T的实例与其子类型的实例:

t match {
  case s: S => /* here, s h as static type S and so printS is available */
  case _:   => /* here only the T's members are available (via t) */
}