Scala';s类型系统与Java';s
在其中一个堆栈溢出回答中,引用了以下内容: Scala是一种完全面向对象的语言,比Java更为如此,它是非研究语言上可用的最先进的类型系统之一Scala';s类型系统与Java';s,java,scala,type-systems,Java,Scala,Type Systems,在其中一个堆栈溢出回答中,引用了以下内容: Scala是一种完全面向对象的语言,比Java更为如此,它是非研究语言上可用的最先进的类型系统之一 Scala的类型系统在哪些方面比Java的更先进?Scala的类型系统几乎可以做Java所能做的一切(去掉一些缺点,比如协变数组)。此外,它还具有以下特点: 方差注释 在T上泛型的抽象类C可以成为C[U]的子类型,其中U是T的子类型或超类型 class C[+T] // C[T] <: C[U] iff T <: U class D[-T]
Scala的类型系统在哪些方面比Java的更先进?Scala的类型系统几乎可以做Java所能做的一切(去掉一些缺点,比如协变数组)。此外,它还具有以下特点: 方差注释 在
T
上泛型的抽象类C
可以成为C[U]
的子类型,其中U
是T
的子类型或超类型
class C[+T] // C[T] <: C[U] iff T <: U
class D[-T] // C[T] <: C[U] iff U <: T
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
的子类型,因为它定义了S
所需的def x:String
和def y:Int
B
不是S
的子类型,因为B
没有定义def y:Int
。请注意,在许多情况下,在访问静态类型为结构类型的值的成员时会使用反射,因此通常不鼓励使用结构类型
不过,它们可以用于模拟,而无需运行时成本
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
,但明确区分了不返回值的函数和不返回值的函数。很抱歉,刚才看到一个问题,要求用户比较groovy Scala和clojure,并获得500多张赞成票。我承认这个问题很广泛,但我不想让它被冠以不适合SOThanks向下投票的标签Scala的类型系统功能,以及其他变量注释、路径依赖类型、更高级类型、适当的存在类型、结构类型、抽象类型和单例类型。Java没有任何这些。好吧,为了添加更多的上下文,我正在学习Scala,所以问题很广泛,但是您rightfold先生现在给了我一个检查列表,谢谢tonI,我认为这是一个非常好的问题。它客观、合理、具体,符合网站的理念:以问答形式提供编程相关知识的数据库。答案超过两段并不意味着它不合适。
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