2014-04-16 158 views
5
val x: AnyRef = 42 

類型不匹配:找到所需Int(42)AnyRef方法被渲染曖昧

注意:從scala.Int => java.lang.Integer隱式存在,但是從Object繼承方法呈現曖昧。這是爲了避免任何暗示,將任何scala.Int轉換爲任何AnyRef

您不妨使用類型歸屬:x: java.lang.Integer

我不明白的強調部分。哪些方法變得模糊不清,以及如何發生?在Scala中,從Object繼承的方法總是「呈現不明確」?這是一種特殊的情況,方法以某種方式在某種類型中多次結束?我只是沒有看到歧義來自何處。

回答

2

Scala不得不假裝Int在繼承層次結構中與Java不同的地方。這導致一些尷尬。考慮方法notify。等待Int不起作用 - 這是一個原始的。等待新盒裝java.lang.Integer也不起作用,因爲其他線程可能已結束與他們自己的分開盒Integer s。你只是不想讓notifyInt上工作 - 這是錯誤的做法。

但如果你有轉換Int => java.lang.Integer沒有什麼異常,你能夠調用notifyInt

爲了防止這種通常是錯誤的行爲,未能解決由於歧義導致的轉換的機制被劫持。這使Int => java.lang.Integer服務轉換Int,其中AnyRef預計(這將打破繼承層次結構),並防止像42.notifyAll這樣的事情工作,因爲即使java.lang.Integer具有該方法,推論機制不會注意它。

您看到的消息應該涵蓋42.notify的情況,而不是42: AnyRef的情況。

+0

您可以擴展「由於歧義被劫持而未能解決轉換的機制」嗎?這正是我不明白的地方。 – fredoverflow