我正在探索Scala语言.我经常听到的一个主张是Scala具有比Java 更强大的类型系统.通过这个我认为人们的意思是:
scalac拒绝某些错误的程序,它们javac会愉快地编译,只会导致运行时错误.我这么认为是对的吗?
Von*_*onC 74
Scala Type系统的主要优点不是更强大,而是更丰富(参见" Scala类型系统 ").
(Java可以定义其中的一些,并实现其他的,但Scala内置了它们).
另见神话制造者1:Scala的"类型类型",评论Steve Yegge的博客文章,他将"Scala"视为"Frankenstein's Monster",因为"有类型类型和类型类型".
(type1, …)=>returnType语法),+T声明T仅在协变位置使用的类型.Stack[T]是Stack[S]if T的子类型的子类型S.-T声明T仅用于逆变位置.Dan*_*ral 16
Java的主要安全问题与方差有关.基本上,程序员可以使用不正确的方差声明,这可能导致在Java中运行时抛出异常,而Scala不允许这样做.
事实上,Java Array是共变体这一事实已经成为一个问题,因为它允许生成错误的代码.例如,如sepp2k所示:
String[] strings = {"foo"};
Object[] objects = strings;
objects[0] = new Object();
Run Code Online (Sandbox Code Playgroud)
然后,当然,Java中有原始类型,它允许所有类型的东西.
此外,虽然Scala也有它,但是有铸造.Java API富含类型转换,并且没有像Scala那样的习惯用法case x: X => // x is now safely cast.当然,有一个案例instanceof用来实现这一目标,但没有动力去做.事实上,Scala的asInstanceOf故意是冗长的.
这些是使Scala的类型系统更强大的东西.正如VonC所示,它也更加丰富.