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._
에 대한 가져 오기가있는 경우 불만없이 작동합니다. 나는 아직도 이유를 이해하지 못한다.
나를 위해 작동하지만 그럼에도 불구하고 당신은'NeoTypeEvidence'의 동반자 객체로 함축을 옮기고 도움이되는지 볼 수 있습니다. – fotNelton
당신이 언급하는 것을 잊어 버린 패키지 객체 안의'package.scala'에있는 것이 있습니까? –
예. 특성과 함축이'package object neo' 안에있었습니다. – Dylan