Normalmente termino probando cada combinación hasta que compila. ¿Alguien puede explicarme qué debo usar dónde?¿Cuáles son las relaciones entre Any, AnyVal, AnyRef, Object y cómo se mapean cuando se usan en código Java?
Respuesta
Voy de acuerdo con Chris'sanswer en un solo sentido. Las clases Any
, AnyRef
y AnyVal
son 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 extiendenAnyRef
y las clases que extiendenAnyVal
.
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.
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?
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
¿Has visto esto? El texto de la página tiene algunas observaciones de interoperabilidad de Java. http://www.scala-lang.org/node/128
- 1. ¿Cuáles son las relaciones actuales entre Eclipse, Aptana y PyDev?
- 2. ¿Cuáles son las diferencias y las relaciones entre "proceso", "hilos", "tarea" y "trabajos" en Linux?
- 3. En Scala, ¿cuál es la diferencia entre Any y Object?
- 4. ¿Cuáles son las diferencias entre java 1.5 y java 1.6
- 5. ¿Cómo se lee la clase de un objeto Scala que amplía Any pero no AnyRef?
- 6. ¿Cuáles son las diferencias fundamentales entre OSGi y Java EE?
- 7. Cuáles son las diferencias en JIT entre Java y .Net
- 8. ¿Cuáles son las distinciones entre alcance léxico y estático?
- 9. ¿Cuáles son los valores predeterminados para las opciones de arco y código cuando se usa nvcc?
- 10. ¿Cuáles son las diferencias entre PHP y Java?
- 11. ¿Cuáles son las diferencias entre LLVM y bytecode java?
- 12. ¿Cuáles son las diferencias entre $ {} y # {}?
- 13. System.StackOverflowException, cuando se establece ¿Se usan las propiedades?
- 14. ¿Cuáles son las diferencias entre ConcurrentQueue y BlockingCollection en .Net?
- 15. ¿Cuáles son las diferencias de uso entre size_t y off_t?
- 16. ¿Cuáles son las diferencias entre Vanilla Perl y Strawberry Perl?
- 17. Diferencia entre Object-C y Java
- 18. ¿Cuáles son las principales diferencias entre JavaScript y ActionScript 3?
- 19. ¿Cuáles son las diferencias entre nil, NULL y [NSNULL nil]?
- 20. ¿Cómo se mapean/deforman/hilos CUDA en núcleos CUDA?
- 21. ¿Cuáles son las diferencias entre StyleCop y Code Analysis cuando se habla de las reglas de cada uno?
- 22. ¿Cuáles son las diferencias y similitudes entre MVC y MVVM?
- 23. ¿Cuáles son los inconvenientes y las soluciones cuando se utilizan entornos virtuales de Python en Windows?
- 24. ¿Cuáles son las diferencias entre JSP y Facelets?
- 25. ¿Cuáles son las diferencias reales entre Zend Framework y Django?
- 26. ¿Qué son los módulos de combinación y cómo se usan?
- 27. ¿Cuáles son las similitudes y diferencias entre las anotaciones Java y los atributos C#?
- 28. ¿Cuáles son las diferencias entre utf8_general_ci y utf8_unicode_ci?
- 29. ¿Cuáles son las diferencias entre JSP, PHP, HTML5 y javascript?
- 30. ¿Cuáles son las diferencias entre XmlSerializer y BinaryFormatter?
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
@ebruchez Gracias por la nota. He actualizado mi respuesta con una descripción general de las nuevas capacidades. –