2016-06-30 3 views
2

У меня есть набор черт/класс, как:Неявное преобразование класса дерева

trait Parent 
case class ChildA(str: String) extends Parent 
case class ChildB(str: String) extends Parent 

object Parent { 
    implicit def toA(str: String) = ChildA(str) 
    implicit def toB(str: String) = ChildB(str) 
} 

и это хорошо работает в случае преобразования для ChildA или ChildB.

На моих тестах я хочу иметь дополнительное правило, что если метод получает Parent это сделать что-то вроде:

implicit def toParent(str: String) = ChildA(str) 

Как это сделать? компилятор, похоже, запутался, так как он может выбирать несколько преобразований для родителя.

+0

Экземпляр ребенка всегда содержит свойства родителя. Что ты пытаешься сделать? Похож на проблему [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). –

ответ

2

Если вы хотите, чтобы toA был выбран более toB для конверсий в Parent, вы можете использовать механизм неявных приоритетов. Неявный имеет более низкий приоритет, если он унаследован от класса или признака.

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

trait Parent 
case class ChildA(str: String) extends Parent 
case class ChildB(str: String) extends Parent 

trait LowerPiorityImplicits { 
    implicit def toB(str: String) = ChildB(str) 
} 

object Parent extends LowerPiorityImplicits { 
    implicit def toA(str: String) = ChildA(str) 
} 

// Exiting paste mode, now interpreting. 

warning: there were two feature warnings; re-run with -feature for details 
defined trait Parent 
defined class ChildA 
defined class ChildB 
defined trait LowerPiorityImplicits 
defined object Parent 

scala> val foo: ChildA = "foo" 
foo: ChildA = ChildA(foo) 

scala> val foo: ChildB = "foo" 
foo: ChildB = ChildB(foo) 

scala> val foo: Parent = "foo" 
foo: Parent = ChildA(foo)