我正在阅读有关Scala Edition1中编程特性的章节中的代码示例, 网址为https://www.artima.com/pins1ed/traits.html
并由于我的错字而遇到奇怪的行为。尽管代码段下面的特征覆盖方法不会产生任何编译错误,但是覆盖方法的返回类型Unit
与相对String
。但是,在对象上调用该方法时,它返回Unit,但不打印任何内容。
trait Philosophical {
def philosophize = println("I consume memory, therefore I am!")
}
class Frog extends Philosophical {
override def toString = "green"
override def philosophize = "It aint easy to be " + toString + "!"
}
val frog = new Frog
//frog: Frog = green
frog.philosophize
// no message printed on console
val f = frog.philosophize
//f: Unit = ()
但是,当我在重写的方法中给出显式的返回类型时,它会产生编译错误:
class Frog extends Philosophical {
override def toString = "green"
override def philosophize: String = "It aint easy to be " + toString + "!"
}
override def philosophize: String = "It aint easy to be " + toString +
^
On line 3: error: incompatible type in overriding
def philosophize: Unit (defined in trait Philosophical);
found : => String
required: => Unit
任何人都可以帮助解释为什么在第一种情况下没有编译错误。
编译器已打印出一个有效的提示,您可以尝试覆盖具有不同结果类型的方法。
—
安德里·普洛霍特努克
确实是的,但是我的问题是为什么它在第一种情况下通过了编译器
—
Shanil
经验法则,对于返回类型_(尤其是在公共API上)_总是要明确的。类型推断非常适合局部变量,仅此而已。
—
Luis MiguelMejíaSuárez'19