2014-10-18 38 views
0

在堆栈溢出的人回答是引述:Scala的类型系统与Java的比较如何?

Scala是一个完全面向对象的语言,比Java更是这样,对非研究语言提供了最先进的类型系统之一。

Scala的类型系统比Java更先进的方式是什么?

+3

对不起,只是看到一个问题,要求SO用户比较groovy scala和clojure,并有500 +的选票。我接受这个问题很广泛,但我不希望它被烙上不适合的SO – 2014-10-18 13:53:51

+0

感谢您反对投票 – 2014-10-18 13:55:18

+2

Scala的类型系统功能 - 其中包括变异注释,路径依赖类型,更高版本类型,适当的存在类型,结构类型,抽象类型和单身类型。 Java没有任何这些。 – rightfold 2014-10-18 14:06:33

回答

10

Scala的类型系统几乎可以完成Java的所有功能(删除了一些瑕疵,比如协变阵列)。此外,它具有以下特征:

方差注解

一个抽象类C即通用上T可由C[U]亚型其中U是亚型或T的超类型。

class C[+T] // C[T] <: C[U] iff T <: U 
class D[-T] // C[T] <: C[U] iff U <: T 

当传递在它们包含的值的类型上参数化的不可变数据结构时,这非常有用。例如,List[String]List[Any]的子类型。

Java为此使用通配符,因此将此转移给API的用户而不是定义者。在很多情况下这是不理想的。

路径依赖类型

在Java中,非静态内部类型存储的指针到包含类型的对象的值。在Scala中也是这样,除了它在类型系统中也是这样工作的。例如:

class P { 
    class C { } 
} 

val x = new P 
val y = new P 
var z = new x.C 
z = new y.C // type error; x.C and y.C are distinct types 

Java缺少此功能; xy都有类型P.C

更高kinded类型

A型不仅可以在另一种类型,还取决于类型构造进行参数设置:

trait Functor[F[_]] { 
    def map[T, U](function: T => U)(functor: F[T]): F[U] 
} 

这是类型类,如FunctorMonad最有用的。

Java缺乏此功能。

结构类型

A型是结构类型的子类型,如果它含有结构式的所有成员。

type S = { def x: String; def y: Int } 

class A { def x = "a"; def y = 1 } 
class B { def y = 1 } 

这里,AS一个亚型,因为它定义了def x: String和由S需要def y: IntB不是S的子类型,因为B未定义def y: Int。请注意,在许多情况下,访问静态类型为结构类型的值的成员时使用反射,因此经常会阻止结构类型的输入。

它们可以用来模拟type lambdas,但没有运行时成本。

Java缺乏这个功能,无论如何它可能不是很有用。

抽象类型

类似的方法,类型可以是抽象的:

trait T { 
    type G 
    def f: G 
} 

class C extends T { 
    override type G = Int 
    override def f = 42 
} 

的Java缺乏此功能。

辛格尔顿类型

的单类型的x包含x和仅x。当一个人想保证一个方法返回this这可以是特别有用的:

trait T { 
    def x: this.type 
} 

class C extends T { 
    def x = this 
} 

val x: T = new C 
x.x // has type x.type (which is a subtype of C), not type T 

在Java中这是不可能的;您必须参数化T并依赖于CRTP,或者请x返回T而不是C

底型

Scala有底部类型Nothing这是所有类型的子类型并且不包含的值。这是throw表达式的类型和从不返回的函数的返回类型(即总是抛出异常或输入无限循环)。

Java缺少此功能并使用void代替。 Scala没有void,但是区分了不返回值和不返回函数的函数。