定義它接受類型的方法:列表[_ <:AnyVal]錯誤消息發送到值類
def foo(x : List[_ <: AnyVal]) = x
嘗試使用AnyRef:
foo(List(new Test))
error: type mismatch;
found : Test
required: AnyVal
Note that implicit conversions are not applicable because they are ambiguous:
both method ArrowAssoc in object Predef of type [A](self: A)ArrowAssoc[A]
and method Ensuring in object Predef of type [A](self: A)Ensuring[A]
are possible conversion functions from Test to AnyVal
問題1:在警告消息,爲什麼編譯器忽略Predef.scala中定義的其他兩個「通用到AnyVal」隱式轉換?
final implicit class StringFormat[A] extends AnyVal
final implicit class any2stringadd[A] extends AnyVal
刪除以前的模糊性,並迫使編譯器使用ArrowAssoc隱式轉換:
foo(List(new Test -> 1))
error: the result type of an implicit conversion must be more specific than AnyVal
問題2:這是什麼錯誤消息,其暗示?它令人困惑。 ArrowAssoc類中的方法def -> [B](y: B): Tuple2[A, B] = Tuple2(self, y)
返回AnyRef類型的Tuple2。所以,一個更有用的錯誤信息可能是found Tuple2 required AnyVal
?
謝謝Jatin。所以,混淆是錯誤信息的不一致。在一種情況下'注意隱式轉換是不適用的。'&另一種'隱式轉換的結果類型必須比AnyVal更具體'這兩種錯誤信息都是因爲碰撞問題相同嗎? – Samar
是的。這是相同的問題相同的錯誤。第二種說法只是對第一種說法的補充說明。 – Jatin
我還有一個問題:當編譯器看到'foo(List(new Test - > 1))'時,它會嘗試評估'new Test - > 1'來看它是否是AnyVal。因此,它執行以下步驟:它找到一個具有 - >定義的隱式類,並且具有 - > defined的唯一隱式範圍是ArrowAssoc類。那麼,這裏應該沒有歧義? – Samar