1

パラメーターの有無にかかわらずオーバーロードされたメソッド定義が存在すると、コンパイル エラーが発生するという問題に対する追加の質問があります。これについては、既にここで説明しています。

要点をまとめると:

 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" )

ありがとう。

4

2 に答える 2

6
assert( (B.foo: String) == "whatever" )
于 2011-10-11T05:28:41.130 に答える
2

foo2 番目の定義に空の括弧を追加できます。

trait A { 
  def foo( s: String ) : String
  def foo() : String
}

次に、他の場所で説明されているように、曖昧さを取り除くことができます。

assert( B.foo() == "whatever" )
于 2011-10-11T06:52:41.273 に答える