2012-03-10 9 views
1

私は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._のインポートを持っていると、それは苦情なしで動作します。私はまだ、なぜ、理解していない。

+0

私のために働きますが、それにもかかわらず、あなたは 'NeoTypeEvidence'のコンパニオンオブジェクトにimplicitsを移動し、それが役立つかどうかを見ることができます。 – fotNelton

+2

あなたが言及し忘れたパッケージオブジェクトの中の 'package.scala'にあるものはありますか? –

+0

はい、その特性と暗示は 'package object neo'の中にありました – Dylan

答えて

1

私の推測では、暗黙的に2回インポートしています。 rules for implicit resolution hereを確認してください。

ほとんどの場合(サンプルでは言いにくいですが)、明示的なインポートを使用していますが、同じパッケージで作業しています(暗黙的に既定で既に存在しています)。

関連する問題