【问题标题】:Types and generics: difference between `[X <: Int]` and `{type X <: Int }`类型和泛型:`[X <: Int]` 和 `{type X <: Int }` 的区别
【发布时间】:2015-09-08 05:43:49
【问题描述】:

据我所知,这两个功能是等价的:

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

def y[Y <: Int](yy: Y): Unit = ()

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

有 2 个符号的原因是什么?使用其中一种或另一种有哪些优点\缺点或你不能\不能做的事情?

【问题讨论】:

  • 如您所见,它是存在类型,别名是方括号中的通配符;利弊无法描述,因为它是不同的类型;在这里你可以阅读更多:drmaciver.com/2008/03/existential-types-in-scala(附样本),不好意思回复,没时间自己写。

标签: scala generics types existential-type


【解决方案1】:

它们确实非常相似,而且你并不孤单。我读过的关于存在类型的最好的文章给你一个很好的解释确实是here(正如@DaunnC 提到的)。其实Abstract Types中还有第三种表达方式。

根据原因,我认为有些东西只是语法糖,而另一些则是语言演变的产物。 Scala 2.14 计划解决一些冗余问题并简化语言。特别是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 2013-01-26
    相关资源
    最近更新 更多