Me gustaría convertir implícitamente entre el objeto Scala XML Elem y otra representación de un elemento XML, en mi caso dom4j Element. Escribí las siguientes conversiones implícitas:Conversión implícita entre los tipos de colección de Scala
implicit def elemToElement(e: Elem): Element = ... do conversion here ...
implicit def elementToElem(e: Element): Elem = ... do conversion here ...
Hasta aquí todo bien, esto funciona.
Ahora también necesito colecciones de dichos elementos para convertir en ambos sentidos. Primero, ¿necesito escribir métodos de conversión adicionales? Las cosas no parecían funcionar si no lo hacía.
Traté de escribir lo siguiente:
implicit def elemTToElementT(t: Traversable[Elem]) = t map (elemToElement(_))
implicit def elementTToElemT(t: Traversable[Element]) = t map (elementToElem(_))
Esto no se ve tan ideal, porque si el método de conversión tiene una de Traversable, entonces también devuelve una de Traversable. Si paso una Lista, también obtengo una Traversable. Así que supongo que la conversión debe ser parametrizada de alguna manera.
¿Cuál es la forma estándar de escribir estas conversiones para ser lo más genérico posible?
¿Por qué es más confuso poder convertir automáticamente de 'X' a' Y' que de 'List [X]' to 'List [Y]'? Satisface exactamente la misma necesidad, es decir, que realmente no le importa qué representación se utiliza y desea que el compilador maneje el trabajo ocupado por usted. –
Es en gran parte una cuestión de estilo y mejores prácticas. Pedir implicidades para que funcione tanta magia es pedir problemas. Son, en mi opinión, uno de los BFG de scala: tenga cuidado con lo que apunta. – sblundy
Estoy de acuerdo con Rex: no estoy de acuerdo con que sea confuso. Por el contrario, yo hubiera esperado incluso que la definición de una conversión implícita de un tipo determinado automáticamente hiciera que la conversión implícita de (digamos "monádica") contenedores para ese tipo también funcionara. – ebruchez