Я играю со сторонней библиотекой, которая имеет интерфейс PropertyContainer
.Он позволяет вам получить / установить свойства в терминах java.lang.Object
, но на самом деле он поддерживает только Java-примитивы, строки и массивы этих вещей.Поэтому я пытаюсь сделать легкую оболочку для класса контейнера свойств.
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")
Я ожидаю, что это будет работать нормально, если предположить, что компилятор найдет неявный 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]
Итак, Scala дважды находит мое неявное преобразование ??Я несколько раз делал clean + rebuild, но это ничего не исправило.Почему это происходит и как я могу это исправить?
edit / note: Я замечаю, что это происходит только при попытке создать Property
в том же пакете, где ипоследствия были определены.Так что, если я делаю точно такой же код в some.other.package
и импортирую для the.main.package._
, он работает без жалоб.Я до сих пор не понимаю, почему.