2012-03-10 2 views
1

PropertyContainer 인터페이스를 가진 타사 라이브러리를 가지고 놀고 있습니다. 그것은 당신이 얻을 수/java.lang.Object의 측면에서 속성을 설정하지만, 정말 단지 자바 원시, 문자열, 그리고 그 것들의 배열을 지원합니다. 그래서 속성 컨테이너 클래스 위에 간단한 래퍼를 만들려고합니다.스칼라가 내 암시 적 변환을 두 번 발견하여 "모호한 암시 적"오류가 발생합니다.

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 것 컴파일러가 암시적인 StringTypeEvidence를 찾아 [String <% NeoTypeEvidence[String]]의 조건을 만족한다고 가정하면 잘 작동합니다. 내가 대신 얻는 것은 오류입니다 :

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] 

그래서 스칼라 두 번 내 암시 적 변환을 찾는 것입니다? 나는 여러 번 다시 정리했는데 아무 것도 고치지 않았다. 왜 이런 일이 일어나고 어떻게 해결할 수 있습니까?/참고

편집 : 나는 내가 implicits가 정의 된 곳과 같은 패키지에 Property을 만들 때 이것은 단지 일어날 것으로 보인다 것을 알 수 있습니다. 따라서 정확히 some.other.package에서 동일한 코드를 사용하고 the.main.package._에 대한 가져 오기가있는 경우 불만없이 작동합니다. 나는 아직도 이유를 이해하지 못한다.

+0

나를 위해 작동하지만 그럼에도 불구하고 당신은'NeoTypeEvidence'의 동반자 객체로 함축을 옮기고 도움이되는지 볼 수 있습니다. – fotNelton

+2

당신이 언급하는 것을 잊어 버린 패키지 객체 안의'package.scala'에있는 것이 있습니까? –

+0

예. 특성과 함축이'package object neo' 안에있었습니다. – Dylan

답변

1

내 생각 엔 암시 적으로 두 번 가져 오는 것입니다. rules for implicit resolution here을 확인하십시오.

대부분의 경우 (샘플은 말하기 어렵지만) 암시 적으로 이미 존재하는 동일한 패키지에서 작업하면서 명시 적 가져 오기를 사용하고 있습니다.