gpt4 book ai didi

java - Scala 的类型系统与 Java 的类型系统相比如何?

转载 作者:行者123 更新时间:2023-12-01 06:43:35 30 4
gpt4 key购买 nike

在 Stack Overflow 的一个答案中引用了这样的话:

Scala is a fully object oriented language, more so than Java, with one of the most advanced type systems available on non-research languages.

Scala 的类型系统在哪些方面比 Java 更先进?

最佳答案

Scala 的类型系统几乎可以完成 Java 可以做的所有事情(删除了一些缺陷,例如协变数组)。此外,它还具有以下特点:

方差注释

T 上通用的抽象类 C 可以成为 C[U] 的子类型,其中 UT 的子类型或父类(super class)型。

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

高等类型

一个类型不仅可以在另一个类型上进行参数化,还可以在类型构造函数上进行参数化:

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

这在 FunctorMonad 等类型类中最有用。

Java 缺乏此功能。

结构类型

如果类型包含结构类型的所有成员,则该类型是结构类型的子类型。

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

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

这里,AS 的子类型,因为它定义了 def x: Stringdef y: Int code> 是 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com