Scala多态性

Rob*_*n64 1 polymorphism scala

我有以下代码:

trait SuperX {
 val v: Int
}

class SubY(val v: Int, var z: SuperX) extends SuperX

class SubZ(val v: Int) extends SuperX
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这是不可能的

var test: SuperX = new SubY(1, new SubZ(-1))
println(test.z.v)
Run Code Online (Sandbox Code Playgroud)

如果我把它写成

var test = new SubY(1, new SubZ(-1))
Run Code Online (Sandbox Code Playgroud)

然后我无法做到

test = test.z
Run Code Online (Sandbox Code Playgroud)

我是Scala的新手,所以有些事情让人很困惑.我知道在Java中可以使用接口而不是特性.

谢谢你的帮助.

Mic*_*jac 5

在这一行:

var test: SuperX = new SubY(1, new SubZ(-1))
Run Code Online (Sandbox Code Playgroud)

你明确告诉编译器test是一个SuperX.并且SuperX不保证类型z,即使这个特定的实例.

当你写:

var test = new SubY(1, new SubZ(-1))
Run Code Online (Sandbox Code Playgroud)

test推断的类型SubY确实有z,所以调用test.z是可以的.

  • 不......你不应该用Java来做这件事,如果没有降级,这是不安全的. (3认同)