1
Symbol
クラスに暗黙的に2つのレベルのimplicits(hereのように)を追加しようとしています。 次のコードを考えてみましょう:暗黙的に変換するときに暗黙のany2stringaddシンボル
case class A(s: Symbol)
case class B(s: A) {
def +[X](s: X)(implicit xtoa: X=>A) = B(xtoa(s))
}
implicit def xToB[X](s: X)(implicit xtoa: X => A) = B(xtoa(s))
implicit def symbolToA(s: Symbol) = A(s)
val x = 'a + 'b
このプログラムはコンパイルされません:
Error: value + is not a member of Symbol
問題ではなく、スニップで定義された暗黙を選んで、Scalaはany2stringadd
機能で'a
を変換しているようです。実際には、以下の二つの実験では、コードのコンパイルを行うように見える:
- 私が代わりに
+
(のような例えばadd
) - の異なる関数名を使用することができ、私は明示的に輸入の
any2stringadd
をシャドウすることができますimport Predef.{any2stringadd => _ , _}
どちらの解決法も嫌いです。私の質問は、代わりに私のプログラムを言い換えて、スカラが自分の含意を選択するように説得することですか?
注:私はscala 2.12.1を使用しています。興味深いことに、IntelliJはこのスニペットについて不平を言っていません。