在下面的代码中我将引用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
}
答案 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) */
}