繁体   English   中英

Scala多态

[英]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))

您是在明确告诉编译器testSuperX 并且即使该特定实例具有类型,也不能保证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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM