パラメーターの有無にかかわらずオーバーロードされたメソッド定義が存在すると、コンパイル エラーが発生するという問題に対する追加の質問があります。これについては、既にここで説明しています。
要点をまとめると:
trait A {
def foo( s: String ) : String
def foo : String = foo( "foo" )
}
object B extends A {
def foo( s: String ) : String = s
}
B.foo // won't compile
エラーメッセージが表示されます:
error: ambiguous reference to overloaded function
both method foo in object B of type(s: String)String
and method foo in trait A of type => String
match expected type Unit
B.foo
機能する解決策は、次のように、期待される型をコンパイラに提供することです。
val s: String = B.foo
残念ながら、常に追加の変数を導入したいとは限りません (たとえば、アサーション内)。上記で参照した以前の記事への回答で少なくとも 2 回推奨された解決策の 1 つは、次のように空の括弧でメソッドを呼び出すことでした。
B.foo()
残念ながら、これは同様のコンパイラ エラー (Scala 2.9.0.1) につながります。
(s: String)String <and>
=> String
cannot be applied to ()
B.foo()
これはバグですか、それとも推奨される解決策が間違っていましたか? そして最終的に:次のように、これを簡潔に行うためのオプションは何ですか:
assert( B.foo == "whatever" )
それ以外の
val expected : String = B.foo
assert( expected == "whatever" )
ありがとう。