私はPropertyContainer
インターフェイスを持つサードパーティのライブラリで遊んでいます。それはjava.lang.Object
の観点からプロパティを取得/設定できますが、実際にはjavaプリミティブ、文字列、およびそれらの配列をサポートしています。だから私はプロパティコンテナクラスの上に軽いラッパーを作ろうとしています。Scalaが私の暗黙的な変換を2回見つけて、「あいまいな暗黙の」エラーを引き起こします。
Property.scala
class Property[A <% NeoTypeEvidence[A]](val name: String) {
def apply(pc: PropertyContainer) = pc.getProperty(name).asInstanceOf[A]
def update(pc: PropertyContainer, value: A) = pc.setProperty(name, value)
}
package.scala
{
sealed trait NeoTypeEvidence[A]
object AnyValTypeEvidence extends NeoTypeEvidence[AnyVal]
object StringTypeEvidence extends NeoTypeEvidence[String]
object AnyValArrayTypeEvidence extends NeoTypeEvidence[Array[AnyVal]]
object StringArrayTypeEvidence extends NeoTypeEvidence[Array[String]]
implicit def anyValToEvidence(v: AnyVal) = AnyValTypeEvidence
implicit def stringToEvidence(s: String) = StringTypeEvidence
implicit def anyValArrayToEvidence(v: Array[AnyVal]) = AnyValArrayTypeEvidence
implicit def stringArrayToEvidence(s: Array[String]) = StringArrayTypeEvidence
}
テストファイル
val name = new Property[String]("name")
私はExPECのでしょうコンパイラが[String <% NeoTypeEvidence[String]]
の条件を満たす暗黙のStringTypeEvidenceを見つけたと仮定して、うまく動作するようにしてください。代わりにエラーが発生します:
ambiguous implicit values:
both method stringToEvidence in package neo of type
(s: String) com.dylemma.neo.package.StringTypeEvidence.type
and method stringToEvidence in package neo of type
(s: String) com.dylemma.neo.package.StringTypeEvidence.type
match expected type
String => com.dylemma.neo.package.NeoTypeEvidence[String]
スカラーは私の暗黙の変換を2回見つけていますか?私は何回もクリーンなリビルドを行ったが、それは何も修正されていない。なぜこれが起こっているのですか?どのように修正できますか?
編集/ノート:私はこれが唯一の私が暗黙に定義された場所と同じパッケージにProperty
を作成しようとすると起こるようですがわかります。したがって、私がsome.other.package
で全く同じコードを実行し、the.main.package._
のインポートを持っていると、それは苦情なしで動作します。私はまだ、なぜ、理解していない。
私のために働きますが、それにもかかわらず、あなたは 'NeoTypeEvidence'のコンパニオンオブジェクトにimplicitsを移動し、それが役立つかどうかを見ることができます。 – fotNelton
あなたが言及し忘れたパッケージオブジェクトの中の 'package.scala'にあるものはありますか? –
はい、その特性と暗示は 'package object neo'の中にありました – Dylan