Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala';s类型系统与Java';s_Java_Scala_Type Systems - Fatal编程技术网

Scala';s类型系统与Java';s

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的更先进?

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