在堆栈溢出的人回答是引述:Scala的类型系统与Java的比较如何?
Scala是一个完全面向对象的语言,比Java更是这样,对非研究语言提供了最先进的类型系统之一。
Scala的类型系统比Java更先进的方式是什么?
在堆栈溢出的人回答是引述:Scala的类型系统与Java的比较如何?
Scala是一个完全面向对象的语言,比Java更是这样,对非研究语言提供了最先进的类型系统之一。
Scala的类型系统比Java更先进的方式是什么?
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缺少此功能; x
和y
都有类型P.C
。
A型不仅可以在另一种类型,还取决于类型构造进行参数设置:
trait Functor[F[_]] {
def map[T, U](function: T => U)(functor: F[T]): F[U]
}
这是类型类,如Functor
和Monad
最有用的。
Java缺乏此功能。
A型是结构类型的子类型,如果它含有结构式的所有成员。
type S = { def x: String; def y: Int }
class A { def x = "a"; def y = 1 }
class B { def y = 1 }
这里,A
是S
一个亚型,因为它定义了def x: String
和由S
需要def y: Int
。 B
不是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
,但是区分了不返回值和不返回函数的函数。
对不起,只是看到一个问题,要求SO用户比较groovy scala和clojure,并有500 +的选票。我接受这个问题很广泛,但我不希望它被烙上不适合的SO – 2014-10-18 13:53:51
感谢您反对投票 – 2014-10-18 13:55:18
Scala的类型系统功能 - 其中包括变异注释,路径依赖类型,更高版本类型,适当的存在类型,结构类型,抽象类型和单身类型。 Java没有任何这些。 – rightfold 2014-10-18 14:06:33