私はScala Edition1のプログラミングにおける特性の章のコード例を通して作業していました https://www.artima.com/pins1ed/traits.html
そして私のタイプミスのために奇妙な行動に出くわしました。以下の特性のオーバーライドメソッドでは、コードスニペットではコンパイルエラーは発生しませんが、オーバーライドされたメソッドの戻り値の型はUnit
vs とは異なり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
最初のケースでコンパイルエラーがない理由を誰かが説明するのを手伝ってくれる?
コンパイラは、異なる結果タイプを持つメソッドをオーバーライドしようとする有効なヒントを出力しました。
—
Andriy Plokhotnyuk
はい、確かに、しかし私の質問は、なぜそれが最初のケースでコンパイラを通過したのか
—
Shanil
経験則として、戻り値の型については常に明確にしてください_(特にパブリックAPIの場合)_。型推論はローカル変数に最適です。
—
Luis MiguelMejíaSuárez19年