Scala中的方法替代行为

问题描述 投票:2回答:2

我正在研究有关Scala Edition1中编程特性的章节中的代码示例。https://www.artima.com/pins1ed/traits.html

并且由于我的错字而遇到了奇怪的行为。尽管代码段下面的特征覆盖方法不会产生任何编译错误,但是覆盖方法的返回类型是UnitString不同。但是,在对象上调用该方法时,它返回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

任何人都可以帮助解释为什么在第一种情况下没有编译错误。

scala overriding traits
2个回答
2
投票

[预期类型为Unitany value can be accepted

值丢弃

如果e具有某种值类型并且预期类型为Unit,则将e嵌入到术语{ e; () }中将转换为预期类型。


1
投票

我的问题是为什么它在第一种情况下通过了编译器

当您未明确指定返回类型时,它是由override工作所需的类型推断出来的。

原来是Unit

由于String值(组成函数体的表达式的值)可以分配给Unit,所以编译器很高兴。

© www.soinside.com 2019 - 2024. All rights reserved.