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
仅用于协变位置。 如果T
是Stack[S]
的子types,则Stack[T]
是Stack[S]
的子types。 - 相反的genericstypes:
-T
将声明T
仅用于逆变位置。
- 协变通用types:注解
- 有界的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表示,它也更加丰富。