[英]Scala Polymorphism
我有以下代码:
trait SuperX {
val v: Int
}
class SubY(val v: Int, var z: SuperX) extends SuperX
class SubZ(val v: Int) extends SuperX
我不明白为什么这不可能
var test: SuperX = new SubY(1, new SubZ(-1))
println(test.z.v)
如果我写成
var test = new SubY(1, new SubZ(-1))
那我就做不到
test = test.z
我是Scala的新手,所以有些事情令人困惑。 我知道在Java中使用接口而不是特征是可能的。
谢谢你的帮助。
在这行上:
var test: SuperX = new SubY(1, new SubZ(-1))
您是在明确告诉编译器test
是SuperX
。 并且即使该特定实例具有类型,也不能保证SuperX
类型具有z
。
当你写:
var test = new SubY(1, new SubZ(-1))
test
的类型被推断为SubY
,它确实具有z
,因此调用test.z
是可以的。
调用后,REPL会告诉您结果是什么类型:
scala> var test = new SubY(1, new SubZ(-1))
这将显示推断的类型引用是SubY
而不是您期望的SuperX
。 如果您不提供,Scala会推断类型。 您的第一个示例明确将其声明为SuperX
test: SubY = SubY@7ee12d58
因此,您只能调用SubY
方法和变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.