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