2011-02-09 18 views
7

Supongamos que MyClass es una clase definida en Java y tiene muchos miembros estáticos y no estáticos. He intentado poner un alias para esta clase (y objeto acompañante asociado) en un objeto Scala MyObject como se muestra a continuación:Escriba aliasing Clases de Java con statics

object MyObject { 
    import javastuff._ 
    type MyAlias = MyClass 
    val MyAlias = MyClass 
} 

scalac se queja:

error: object MyClass is not a value 
val MyAlias = MyClass 

¿Cómo trabajo alrededor de esto? Gracias.

+3

¿Para qué exactamente estás tratando de usar 'val MyAlias'? El aliasing tipo se hace con la palabra clave 'type', que ya ha hecho. 'val MyAlias' es una declaración de valor, MyClass es un nombre de tipo y no un valor, por lo que no puede asignar MyClass a' val MyAlias'. Por favor, danos algunos casos de uso. –

+3

@Wong, ya que la invocación de los métodos estáticos de Java se realiza con JavaClass.staticMethod, como si JavaClass fuera un 'objeto' de Scala, @Siddharth quiere una forma de "alias" esta representación de los métodos de clase de la misma manera que se puede lograr en Scala en relación con 'objeto' de Scala, por ejemplo 'val obj = scalaObject'. – pedrofurla

Respuesta

6

Aunque esto funciona en Scala puro para un objeto compañero de clase +, no es posible con los métodos estáticos de Java, ya que estos no pertenecen a ninguna interfaz.

Scala podría, en teoría, crea un objeto que contenga delegados a todos los métodos estáticos de alguna clase, pero no lo hace actualmente. También es posible escribir un complemento de compilación para esto si se siente cómodo escribiendo complementos.

De lo contrario, tendrá que crear un objeto lleno de delegados usted mismo, o simplemente seleccionar unos pocos métodos y pasarlos como funciones.

+1

Y así registramos otro caso de esquina en Scala. <*sigh*> –

+1

Es un caso de esquina bien, pero este no es de Scala. Ahora mismo puedo ver la JVM en algún bar, acusándome de no usar protección y participar en actividades que no están orientadas a objetos: "¡Pero ella (Scala) solo lo estaba pidiendo! Puede haber dicho que no, pero Sé que ella quiso decir que sí. Es solo una burla y es su culpa por sentarse en mi regazo en primer lugar ... " –

0

no es posible con los métodos estáticos de Java, ya que estos no pertenecen a ninguna interfaz.

actualización 5 años más tarde: PR 5131 menciones:

Hemos utilizado para desactivar la generación de agentes de estática cuando un objeto tenía un rasgo como compañero, como no se podía añadir métodos con los cuerpos a un interfaz en JVM 6.

La JVM levantó esta restricción para admitir los métodos predeterminados en las interfaces, , por lo que también podemos eliminar la restricción en los reenviadores estáticos.

Correcciones scala-dev issue 59

Ver commit 41c9a17 por Jason Zaugg (retronym).