は種類を受け取るメソッドの定義:リスト[_ <: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で定義された他の2つの "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
でしたか?
Thanks Jatin。だから、混乱は、エラーメッセージの矛盾です。あるケースでは、 '暗黙の変換は適用されないことに注意してください.'と他の'暗黙の変換の結果タイプは、AnyValよりも具体的でなければなりません。両方のエラーメッセージは同じ衝突の問題のためです? – Samar
はい。同じ問題に関連する同じエラーです。 2番目のステートメントは、最初のステートメントに追加された説明です。 – Jatin
私は別の質問があります。コンパイラが 'foo(List(new Test - > 1))'を見たときに 'new Test - > 1 'を評価してAnyValの型かどうかを調べようとします。したがって、以下のステップを実行します。 - >定義されているスコープ内の唯一の暗黙のクラスがArrowAssocクラスである暗黙のクラスを見つけます。だからここにあいまい性はないはずですか? – Samar