2010-06-24 25 views
55

Estoy explorando el lenguaje Scala. Una afirmación que a menudo escucho es que Scala tiene un sistema de tipo más fuerte que Java. Por esto creo que lo que la gente quiere decir es que:Ventajas del sistema de tipo de Scala

  • scalac rechaza ciertos programas con errores, que javac compilará felizmente, sólo para causar un error de ejecución.
  • Ciertas invariantes se pueden codificar en un programa Scala de modo que el compilador no permita que el programador escriba código que viole la condición.

¿Estoy en lo cierto al pensar en eso? Si es así, señale artículos/blogs/documentos que ilustren dichos ejemplos.

+4

Java no le permitirá compilar "programas con errores" más de lo que lo hace Scala; sin embargo, Scala * permite * muchas más construcciones para ser expresadas [de manera segura], y generalmente en un método mucho más fácil, que Java. Sin embargo, Scala aún "sufre" de borrado de tipo. –

+15

@pst: Sí, lo hará. 'String [] strings = {" foo "}; Objetos [] objetos = cadenas; objects [0] = new Object(); 'se compilará muy bien en java y luego lanzará un NPE en tiempo de ejecución. El código scala equivalente no se compilará. – sepp2k

+5

@ sepp2k Creo que se trata de una 'ArrayStoreException' que se lanza, no una NPE. –

Respuesta

72

La principal ventaja del sistema Tipo Scala es no ser tan fuerte sino más bien ser mucho más rica (ver "The Scala Type System").
(Java puede definir algunos de ellos e implementar otros, pero Scala los tiene incorporados).
Véase también The Myth Makers 1: Scala's "Type Types", comentando Steve Yegge's blog post, donde "descarta" a Scala como "Monstruo de Frankenstein" porque "hay tipos de tipos y tipos de tipo de tipo".

+0

Gracias por la descripción detallada. Leeré los artículos vinculados para obtener una mejor comprensión. –

+1

Nota para mí: vea también mi respuesta anterior http://stackoverflow.com/questions/2682673/what-compromises-scala-made-to-run-on-jvm/2682962#2682962 – VonC

+1

Nota para mí: con implícito y el nuevo 2.8 límite de contexto, el patrón como "Tipo de clase" se define y usa fácilmente: http://dcsobral.blogspot.com/2010/06/implicit-tricks-type-class-pattern.html – VonC

14

El principal problema de seguridad con Java se relaciona con la varianza. Básicamente, un programador puede usar declaraciones de varianza incorrectas que pueden dar lugar a excepciones lanzadas en tiempo de ejecución en Java, mientras que Scala no lo permitirá.

De hecho, el hecho mismo de que el Array de Java sea una variante es ya un problema, ya que permite que se genere código incorrecto. Por ejemplo, como se ejemplifica en sepp2k:

String[] strings = {"foo"}; 
Object[] objects = strings; 
objects[0] = new Object(); 

Luego, por supuesto, hay tipos primas en Java, que permite todo tipo de cosas.

Además, aunque Scala también lo tiene, hay fundición. La API de Java es rica en moldeados de tipos, y no hay lenguaje como el de Scala case x: X => // x is now safely cast. Claro, un caso usa instanceof para lograr eso, pero no hay ningún incentivo para hacerlo. De hecho, el asInstanceOf de Scala es intencionalmente detallado.

Estas son las cosas que fortalecen el sistema de tipos de Scala. También es mucho más rico, como muestra VonC.

+0

Finalmente, una respuesta que está más "en tema" que la mía lista "más general";) +1 – VonC

+0

respondió la pregunta original con precisión, pero VonC respondió una pregunta ligeramente diferente. Estoy votando su respuesta como la correcta, pero tu respuesta es muy apreciada también. Espero que no te importe perder los puntos de reputación. –

+0

@binil No, en absoluto. La respuesta de VonC es genial, incluso si realmente no necesita la reputación extra ... ;-) –

Cuestiones relacionadas