名前の重複

Scalaはdef、val、varの全てが同じ名前空間を共有する。
当然、同じ名前のメソッドとフィールドを持つことはできない。
正確にはオーバーロードがあるため、引数のないメソッドがフィールドと重複してしまうことになる。
この仕様はどうなんだろう?
これもパラメータなしメソッドを導入している影響だろうか?
当然パラメータなしメソッドと空括弧メソッドも重複することになる。
一応整理することにする。

(01) def hoge() = 10
(02) def hoge = 10
(03) val hoge = 10
(04) var hoge = 10

上記は全て重複するとみなされ、同じクラスやトレイトやオブジェクトには書けない。

Scalaではトレイトを使って実装の多重継承っぽいことができる。
その際、重複したものがあればエラーになるようなので、できるだけ重複は避けた方がよくないか?
例えば、hogeというフィールドを持っているトレイトと、hogeという引数なしのメソッドをもつトレイトは同時には取り込めない。
オーバロードできるくらいなんだから、引数のないメソッドとフィールドくらい区別した方がいいと思うんだが。