Scala的types系统的优点

我正在探索Scala语言。 我经常听到的一个说法是,斯卡拉比Java 更强大的types系统。 通过这个我觉得人们的意思是:

  • scalac拒绝某些bug的程序, javac会快乐地编译,只会导致运行时错误。
  • 某些不variables可以在Scala程序中编码,这样编译器不会让程序员编写违反条件的代码。

我是这么想的吗? 如果是这样,请指出说明这些例子的文章/博客/论文。

Scalatypes系统的主要优点并不是更强大 ,而是更丰富 (参见“ Scalatypes系统 ”)。
(Java可以定义其中的一些,并实现其他,但斯卡拉有内置的)。
另请参阅神话制造者1:斯卡拉的“typestypes” ,评论史蒂夫·叶格的博客post ,他认为斯卡拉是“科学怪人的怪物”,因为“有typestypes和typestypes”。

  • 值types类(对于具有值语义的合理的小数据结构非常有用),而不是基元types(Int,Doubles,…),并且隐式转换为其他方法的“Rich”类。
  • 不可空的types
  • Monadtypes
  • 特质types(和它自带的mixin组合 )
  • 单身人士对象types(只需定义一个“对象”,你有一个),
  • 复合types (对象types的交集,表示对象的types是其他几个types的子types),
  • 函数types ( (type1, …)=>returnType语法),
  • Case类 (导出构造函数参数的常规类,通过模式匹配提供recursion分解机制),
  • path依赖types (允许嵌套types的语言提供了引用这些typespath的方法),
  • 匿名types (用于定义匿名函数),
  • 自我types (可以在特质中使用 ),
  • input别名 ,以及:
  • 包对象 (2.8中介绍)
  • genericstypes (如Java),使用types参数注释机制来控制genericstypes的子types行为,
    • 协变通用types:注解+T声明typesT仅用于协变位置。 如果TStack[S]的子types,则Stack[T]Stack[S]的子types。
    • 相反的genericstypes: -T将声明T仅用于逆变位置。
  • 有界的genericstypes(即使Java支持它的某些部分 ),
  • 更高级的types ,允许expression更高级的types关系,比Java Generics更可能,
  • 抽象types (genericstypes的替代),
  • 存在types ( 在Scala中使用,如Java通配符types),
  • 隐式types (请参阅“ Scala的迷人是隐含的 ”,
  • 查看有界的types和
  • 结构types ,用于通过指定所需types的特征(鸭式打字)来指定types。

Java的主要安全问题与方差有关。 基本上,程序员可以使用不正确的差异声明,这可能会导致Java运行时抛出exception,而Scala不会允许它。

事实上,Java的Array是一个共同的变种已经是一个问题,因为它允许不正确的代码生成。 例如,以sepp2k为例 :

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

那么,当然,在Java中有原始types,它允许各种各样的东西。

此外,虽然斯卡拉也有,但还有铸造。 Java API丰富的types转换,并没有像斯卡拉的case x: X => // x is now safely cast下来的成语。 当然,有一个案例使用instanceof来完成,但是没有动机去做。 事实上,Scala的asInstanceOf是故意冗长的。

这些是使Scala的types系统更强大的东西。 VonC表示,它也更加丰富。