10

Me gustaría agregar conversiones implícitas a las clases de Java generadas por una herramienta de modelado. Por lo tanto, quiero agregarlos al objeto complementario de esas clases, para que el compilador los encuentre automáticamente. Pero no puedo agregarlos en un archivo separado, porque el compañero debe definirse en el mismo archivo. ¿Hay algo que pueda hacer al respecto?En Scala, ¿cómo puedo definir un objeto complementario para una clase definida en Java?

Por supuesto, puedo definir todas mis conversiones implícitas en otro objeto y luego ponerlo en el alcance, pero esto requiere una importación adicional. ¿Alguna otra solución?

+2

Puede definir conversiones implícitas en el objeto del paquete, evitando la importación adicional. – axel22

+0

Las clases de Java no tienen un objeto complementario. ¿Quiere decir que está intentando engañar y hacer que parezca que una clase Java tiene un objeto complementario? –

+0

@Rex Kerr: Sí, bueno, no sabía que se consideraba hacer trampa. @ axel22: ¡Buena idea, creo que seguiré adelante con eso! –

Respuesta

9

Con el compilador Scala tal como está ahora no hay manera para definir objetos complementarios que no sean ponerlos en el mismo archivo. Lo mejor que puede hacer es un objeto no complementario con el mismo paquete y nombre y una importación adicional.

Si puede pensar en una buena manera de crear una compañía post-hoc sin romper las suposiciones sobre la encapsulación, por favor, publíquela en http://groups.google.com/group/scala-debate porque sería claramente una característica muy útil.

9

Puede definir su propio objeto complementario, por supuesto, que a menudo hago en mi propio acuerdo de proyecto específico Predef. Por ejemplo:

object domain { 

    type TimeUnit = java.util.concurrent.TimeUnit 
    object TimeUnit { 
    def valueOf(s : String) = java.util.concurrent.TimeUnit.valueOf(str) 
    val Millis = java.util.concurrent.TimeUnit.MILLISECONDS 
    //etc 
    } 

Entonces esto puede ser usado:

import my.domain._ 
val tu : TimeUnit = TimeUnit.valueOf("MILLISECONDS") 

Pero su domain.TimeUnit es un módulo (es decir Scala object)

+0

Eso sería un "objeto independiente", no un objeto complementario, ¿no? (el resultado final es el mismo aquí) – VonC

+3

que, al menos, no funcionará para las conversiones implícitas (que son un punto ideal de los objetos complementarios) –

+0

Eso es cierto, pero sigue siendo un objeto en sí mismo y puede ser pasó alrededor de –

Cuestiones relacionadas