10

¿Por qué todas las clases de Scala heredan de ScalaObject aunque ese rasgo está completamente vacío y no tiene funcionalidad (visible?) En comparación con AnyRef, ¿qué define métodos adicionales?¿Por qué `ScalaObject` existe?

¿No va a ralentizar el método llamadas como equals() o hashCode() porque tendrá que tener en cuenta otra clase (que puede anular los métodos)?

¿No es posible doblar AnyRef y ScalaObject en una sola clase?

ACTUALIZACIÓN: ScalaObject was eradicated con la nueva versión 2.10 de Scala.

Respuesta

11

ScalaObject inserta un método $tag, que, de acuerdo con el comentario en el library source code for 2.7 "que se necesita para el patrón de búsqueda de expresiones que coinciden en constructores de clases de casos optimización." Dado que el nombre comienza con $, debería por supuesto considerarse "oculto" para los programadores de aplicaciones. En Scala 2.8, está completamente vacío, así que supongo que está ahí para compatibilidad con versiones anteriores.

+0

¿Por qué no se inserta ese método $ tag en AnyRef? – soc

+0

Compatibilidad con versiones anteriores, supongo. (Extendí mi respuesta después de descargar y leer el código fuente 2.8.) –

+0

He codificado el código del compilador y hay algún código para manejarlo de una manera especial (archivo 'Global.scala'), pero no hay explicación de por qué está allí. –

4

También es un útil gancho para análisis estáticos. Por ejemplo, imagine que tiene una herramienta que puede buscar a través de una base de código (compilada o no), y decirle que puede mejorar alguna métrica de cohesión/acoplamiento/equilibrio de capa/lo que tiene extrayendo un rasgo de estos clases y crea conversiones implícitas para esas clases. Esta herramienta solo informaría con sensatez los rasgos que podrían extraerse de manera rentable de las clases que heredan ScalaObject, al tiempo que informa las conversiones implícitas rentables de cualquier clase de Java. La misma herramienta informaría sobre los posibles retornos "nulos" de las subclases de ScalaObject (donde Opción o similar suele ser una mejor opción), mientras se ignoran los retornos nulos de las clases de Java.

7

El envío de métodos no encadena la estructura de herencia de clase en busca de implementaciones. El compilador construye una tabla de envío de métodos netos para cada clase que refleja su linaje de método de redefinición/heredado. Es una de las virtudes de resolver estáticamente todo el tipeo.

Cuestiones relacionadas