Closed. This question needs to be more focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
5年前关闭。
在堆栈溢出答案之一中,引用了以下内容:
Scala是一种完全面向对象的语言,比Java更重要,它是非研究语言上可用的最先进的类型系统之一。
Scala的类型系统在哪些方面比Java更高级?
当传递根据其包含的值的类型参数化的不可变数据结构时,这非常有用。例如,
Java为此使用通配符,从而将处理此问题的责任转移给了API的用户,而不是定义者。在许多情况下,这是次优的。
路径相关类型
在Java中,非静态内部类类型的值存储指向包含类类型的对象的指针。在Scala中也是如此,只是它在类型系统中也是如此。例如:
Java缺少此功能。
种类更多
一个类型不仅可以在另一个类型上进行参数化,还可以在一个类型构造函数上进行参数化:
这在
Java缺少此功能。
结构类型
如果类型包含结构类型的所有成员,则它是结构类型的子类型。
此处,
但是,它们可用于模拟type lambdas,而无需花费运行时间。
Java缺少此功能,而且无论如何它不是很有用。
抽象类型
像方法一样,类型可以是抽象的:
Java缺少此功能。
单例类型
在Java中这是不可能的。您要么必须参数化
底型
Scala具有底部类型
Java缺少此功能,而是使用
想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
5年前关闭。
在堆栈溢出答案之一中,引用了以下内容:
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
。种类更多
一个类型不仅可以在另一个类型上进行参数化,还可以在一个类型构造函数上进行参数化:
trait Functor[F[_]] {
def map[T, U](function: T => U)(functor: F[T]): F[U]
}
这在
Functor
和Monad
之类的类型类中最有用。Java缺少此功能。
结构类型
如果类型包含结构类型的所有成员,则它是结构类型的子类型。
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
和def y: Int
,这是S
必需的。 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
,但是明确区分了不返回值的函数和不返回值的函数。关于java - Scala的类型系统与Java相比如何? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26440436/