类型和泛型:`[X <:Int]`和`{type X <:Int}`之间的区别

Eug*_*Loy 5 generics types scala existential-type

据我所知,这两个函数是等价的:

def x(xx: X forSome { type X <: Int }): Unit = ()

def y[Y <: Int](yy: Y): Unit = ()
Run Code Online (Sandbox Code Playgroud)

根据我的观察,现在人们大多使用第二种形式(使用[]),同时我有时会看到使用第一种形式的文章(大多是旧的,讨论存在类型)(forSome).

有2个符号的原因是什么?有没有一个专业人士或缺点或你可以\使用一个或另一个不能做的事情?

Dan*_*don 1

它们确实非常相似,而且您并不孤单地陷入困惑。我读过的关于存在类型的最好的文章确实在这里给了你一个很好的解释(正如@DaunnC提到的)。实际上还有第三种方法可以在抽象类型中表达相同的内容。

就原因而言,我认为有些东西只是语法糖,而另一些则是语言进化的产物。Scala 2.14计划解决一些冗余问题并简化语言。尤其:

对所有形式的信息省略进行简化和统一的类型语法:存在类型和部分类型应用都用 _ 表示,消除了 forSome 语法。