2016-09-23 9 views
0

は種類を受け取るメソッドの定義:リスト[_ <: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でしたか?

答えて

2

最初に2番目の質問にお答えします。これを試してください:

class Temp 

implicit class Arrow[T](a:T) extends Temp{ 
    def -->[B](b:B) = (a,b) 
} 
def foo(x : List[_ <: Temp]) = x 

scala>  foo(List(1 --> 2)) 
res0: List[Temp] = List([email protected]) 

これは期待どおりです。 Tempを検索していて、Tuple2ではないので、不平を言っていません。これは、衝突を訴えて失敗

implicit class OtherTemp[T](a:T) extends Temp{} 
foo(List(1 --> 2)) //compile error 

: は今あいまいさを紹介します。だからあなたがなぜAnyRefを表示しなかったのかという質問に答えるためには、

を覚えておいてください。AnyValを得るために呼び出されています。 ->では、Tuple2を持ち、AnyValを取得しようとしています。また、AnyValを取得できないため、AnyValに変換できないとエラーとしてエラーとマークします。その真のアイデンティティは無関係です。

最初の質問の場合: 私の理解では、implicitsは最初の検索基準となります。だから二度見つけてあいまいさがあると、それは不平を終わらせます。それはこれが再注文暗黙の順序によってREPL上で確認することができますなどStringFormatにしようとしない理由、これがあるかもしれコンパイラは文句

implicit class OtherTemp2[T](a:T) extends Temp{ 
} 
implicit class OtherTemp[T](a:T) extends Temp{ 
} 

foo(List[Temp]("asdf")) 

Arrowなどとの衝突などOtherTemp2。再注文してreplを再度実行すると、どの暗黙的なものが最初に見つかったかに基づいて賛成します。 しかし、これを確認する正式な情報源は見つかりません。

+0

Thanks Jatin。だから、混乱は、エラーメッセージの矛盾です。あるケースでは、 '暗黙の変換は適用されないことに注意してください.'と他の'暗黙の変換の結果タイプは、AnyValよりも具体的でなければなりません。両方のエラーメッセージは同じ衝突の問題のためです? – Samar

+0

はい。同じ問題に関連する同じエラーです。 2番目のステートメントは、最初のステートメントに追加された説明です。 – Jatin

+0

私は別の質問があります。コンパイラが 'foo(List(new Test - > 1))'を見たときに 'new Test - > 1 'を評価してAnyValの型かどうかを調べようとします。したがって、以下のステップを実行します。 - >定義されているスコープ内の唯一の暗黙のクラスがArrowAssocクラスである暗黙のクラスを見つけます。だからここにあいまい性はないはずですか? – Samar