2010-02-25 12 views

Respuesta

100

Voy de acuerdo con Chris'sanswer en un solo sentido. Las clases Any, AnyRef y AnyValson clases. Pero no aparecen como clases en bytecode, debido a las limitaciones intrínsecas de la JVM.

Esto se debe al hecho de que no todo en Java es un objeto. Además de los objetos, hay primitivos. Todos los objetos en Java son descendientes de java.lang.Object, pero las primitivas están separadas y, actualmente, *, no son extensibles por un programador. Tenga en cuenta también que los primitivos tienen "operadores", no métodos.

En Scala, por el contrario, todo es un objeto, todos los objetos pertenecen a una clase, e interactúan a través de métodos. El bytecode de JVM generado no refleja esto, pero eso no los hace menos importantes, al igual que Java tiene genéricos, aunque el bytecode no los tenga.

Por lo tanto, en Scala, todos los objetos son descendientes de Any, y eso incluye tanto lo que Java considera los objetos como lo que Java considera primitivos. No hay equivalente en Java porque no existe tal unificación.

Todo lo que se considera una primitiva en Java es descendiente de AnyVal en Scala. Hasta que se selló Scala 2.10.0, AnyVal, y los programadores no pudieron extenderlo. Debería ser interesante ver qué sucederá con Scala en .Net, ya que solo la interoperabilidad exige que Scala reconozca al menos las "primitivas" definidas por el usuario.

También se extiende Any es AnyRef, que es equivalente a java.lang.Object (en la JVM de todos modos).

Hasta Scala 2.9.x, un usuario no podría extenderse Any o AnyVal, ni hacer referencia a ellos desde Java, pero no eran otros usos que se podrían poner en Scala. Específicamente, escriba las firmas:

def f(x: AnyVal) = println(x) 
def g(x: AnyRef) = println(x) 
def h(x: Any) = println(x) 

Lo que cada medio debe ser obvio desde la jerarquía de clases.De nota, sin embargo, es que f y h se auto-box, pero g no lo hará. Eso es un poco lo contrario de lo que hace Java, en que f y h no se pueden especificar, y g (definido con java.lang.Object) causaría el auto-boxeo.

Comenzando con Scala 2.10.0, sin embargo, el usuario puede extender AnyVal o Any, con las siguientes semántica:

  • Si una clase se extiende AnyVal, no se creará ningún ejemplo para ello en el montón bajo ciertas condiciones. Esto significa que los campos de esta clase (en 2.10.0 solo se permite un solo campo, si eso cambiará queda por verse) permanecerán en la pila, ya sean primitivos o referencias a otros objetos. Esto permite métodos de extensión sin costo de instanciación.

  • Si un rasgo se extiende Any, entonces se puede utilizar con ambas clases que extienden AnyRef y las clases que extienden AnyVal.

PD: En mi propio punto de vista, Java es probable que siga C# en permitir primitivas "estructura", y tal vez typedefs, como el paralelismo sin tener que recurrir a ellos está resultando difícil de lograr con un buen rendimiento.

+2

Una actualización: a partir de Scala 2.9.2, 'AnyVal' se define como' rasgo sellado AnyVal extends Any'. Pero en Scala 2.10 esto ha cambiado a 'clase abstracta AnyVal extiende Cualquiera con NotNull', y ahora es posible extender' AnyVal' con la nueva característica de clases de valor, por ejemplo: 'clase MyValue (val u: Int) extiende AnyVal'. – ebruchez

+0

@ebruchez Gracias por la nota. He actualizado mi respuesta con una descripción general de las nuevas capacidades. –

2

Any y AnyVal son, creo, que forma parte del sistema de tipos Scala y no son clases, tales como (de la misma manera que Nothing es un tipo, no una clase). No puede usarlos explícitamente desde el código Java.

Sin embargo, en la interoperación Java/Scala, un método que acepta Java Object esperará una scala Any/AnyRef.

¿Qué estás intentando hacer?

+0

Estoy tratando de entender mejor este tema para saber qué tipo debo usar cuando estoy planeando que Java llame a Scala o viceversa. Esta respuesta http://stackoverflow.com/questions/2334200/transforming-scala-varargs-into-java-object-varargs/2334331#2334331 y su conversión a 'AnyRef' solo me recordó que esto todavía era misterioso para mí. – huynhjl

Cuestiones relacionadas