これが私たちのアプリケーションで何が起こっているかの単純化されたコードです.Stringをjava.lang.Booleanにキャストすることはできませんクラスキャスト例外(「==」オーバーライド)
私は何か間違っていることを理解していますが、わかりません。
class First { def ==(first:First)= true}
、今REPLに誤りがある:
error: type mismatch;
found : First(in object $iw)
required: First(in object $iw)
Second(new First) == Second(new First)
さらに予想外の私には:
\私は変更することで、コードを変更したEDIT
UPDATE 2番目の例は私のせいです。 REPLのクラスFirstを対話的に変更して、奇妙な結果を引き起こしました。最初から始めるそれは動作します。それでも...最初の1つ...
この説明は水を保持しているようには見えません。コンパイラーは実際にはオーバーロードされたメソッドを呼び出すときに、戻り値の型を考慮に入れるほどスマートです。私がこれをするとき、 'class Foo {def bar(x:Any):Boolean = false; (foo:)。bar( "baz") 'が正しく動作し、' false'を返します。 – Dima
@Dima私がhttp://www.scala-lang.org/files/archive/spec/2.12/06-expressions.html#overloading-resolutionを正しく読んでいるのであれば、それは正しく動作しません。両方代替は適用可能であり(パラメータ型のみに依存する)、戻り型の型は多型の場合のみ重要です。もちろん、ルールはかなり複雑なので、何かが欠けているかもしれません。 –
@Dimaまた、コンパイラはキャストを挿入するので(そうでなければ 'ClassCastException'が存在しないため)、' first == x.first'自体に期待される型がないので、コンパイラはそれを使用して過負荷を選択することはできません。つまり、私の説明によれば、代わりに 'val foo:Boolean = new Foo()。bar(" baz ")。asInstanceOf [Boolean]'を試す必要があります。 –