2012-09-05 6 views
22

Viniendo de Java Land He estado tratando de enseñarme a mí mismo Scala. Recientemente estaba jugando con el tipo de datos Int y decidí buscar la API para la clase Int here.tratando de entender "clase abstracta final Int privada extiende AnyVal en Scala

lo perplejo mí era la definición de clase de Int, que es abstract final.

soy disculpa si no he leído sobre el significado de abstract y final en Scala antes de hacer esta pregunta, pero estaba curioso, así que escribí esta publicación de inmediato.

Entonces, lo que estoy tratando de entender es: ¿La semántica de abstract, final y extends es diferente en Scala? Una vez más, tengo entendido que en Java, uno no puede tener abstract y final al mismo tiempo. Entonces, ¿cómo interpreto final abstract class Int private extends AnyVal?

+1

No, no lo son, al menos, básicamente, (todavía no se puede crear una instancia abstracta, no se puede heredar/anular final). AFAIK, la razón por la que esto se hizo de esta manera es que hace algún tiempo Int y otros tipos de AnyVal eran solo un código auxiliar, reescrito por el compilador en el momento de la compilación. No lo son desde [este compromiso] (https://github.com/scala/scala/commit/4253124eecba6bed38f1dc961c5c4ee39a29f730) –

+0

Oh, esa es información útil. Gracias por señalarme que – ilango

Respuesta

28

Como om-nom-nom señaló en el comentario, abstract prohíbe instanciación (new Int), mientras que final prohibe subclases (new Int { ... }).

La razón para esto es que scala.Int está representado directamente por el tipo de entero primitivo de la máquina virtual Java; los otros tipos similares son Byte, Short, Char, Long, Float, Double, Boolean. Debido a que son tipos primitivos en el tiempo de ejecución (que muestran un mejor rendimiento que los denominados tipos encuadrados) y la JVM no permite agregar nuevas primitivas, no habría forma legal de extender esos tipos. Además, no hay forma de instanciarlos de otra forma que no sea dando un literal (val i: Int = 33).

Scala tiene estos tipos para crear un sistema de objeto unificado donde no hay diferencia lógica entre los tipos primitivos y los 'objetos'. Sin embargo, hay una distinción jerárquica en la parte superior que es AnyRef (correspondiente a java.lang.Object) y AnyVal (correspondiente a esos tipos primitivos, y que agrega el nuevo tipo de Scala Unit).

Más sobre el sistema de tipos unificado es dada por el Tour of Scala: Unified Types

+0

Muy apreciado. – ilango

+0

Tengo que tener en cuenta que también hay [aceptado SIP] (http://docs.scala-lang.org/sips/pending/value-classes.html) que dará rienda suelta al uso de primitivas no compartidas con un comportamiento no predeterminado. –

+1

P.S. Y aunque todas las primitivas de JVM están representadas por subtipos de 'AnyVal', lo inverso no es verdadero ('Unidad' ya se mencionó). En Scala 2.10, es posible extender 'AnyVal', creando las llamadas [Value-Classes] (http://docs.scala-lang.org/sips/pending/value-classes.html) que están destinadas para el implementación de nuevas clases numéricas, beneficiándose de las optimizaciones del compilador (por ejemplo, en línea). –

Cuestiones relacionadas