這就是在我們的應用程序發生的簡化代碼:類轉換異常(「==」覆蓋)
class First { def ==(first:First)= "mystring"}
case class Second(first:First)
Second(new First) == Second(new First)
這給予: java.lang.ClassCastException:java.lang中.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)
更意想不到的對我說:\
UPDATE第二個例子是我的錯。我在REPL中交互式地改變了類,導致了奇怪的結果。從頭開始它的工作原理。仍然是第一個...
這個解釋似乎並不成立:編譯器實際上足夠聰明,可以在選擇重載方法調用時考慮返回類型。當我這樣做:'Foo {def bar(x:Any):Boolean = false; def bar(x:String):String = x}',然後'val foo:Boolean = new 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]'。 –