首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scala中的泛型是如何工作的?

scala中的泛型是如何工作的?
EN

Stack Overflow用户
提问于 2014-01-19 17:05:43
回答 2查看 129关注 0票数 0

我知道擦除是什么类型的。因此,我认为scala不能准确地检测泛型类型。

如前所述,scala无法检测模式匹配中的泛型类型,如下所示:

代码语言:javascript
复制
    case list: List[Int]

但是,当我声明列表类型值时,scala会检测到包含了什么泛型类型。

代码语言:javascript
复制
    scala> val a = List(1,2,3)
    a: List[Int] = List(1, 2, 3)

这怎么可能呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-19 17:20:51

代码语言:javascript
复制
val a = List(1,2,3)

这相当于:

代码语言:javascript
复制
val a = List.apply[Int](1,2,3)

List.apply[Int](...)的结果类型是List[Int],因此,类型推断器将此类型分配给标识符a。这种情况发生在编译期间。REPL不会在运行时“检测”该类型。

这与模式匹配不同:

代码语言:javascript
复制
val a: Any = ...
a match {
  case list: List[Int] => ...
}

这里,我们有一个值a,对于这个值,我们没有任何类型信息。所以我们试图检查它的类型,但是现在我们在运行时中这样做。在这里,我们确实无法确定确切的类型。我们在这里能做的最好的就是和List[_]比赛。

总结:当您在REPL中键入一些代码时,首先将其编译成字节码,然后进行评估。显示的类型信息来自编译阶段,因此它不受类型擦除的影响。

票数 4
EN

Stack Overflow用户

发布于 2014-01-19 17:23:37

当你写:

代码语言:javascript
复制
val a = List(1,2,3)

Scala使用类型推断在编译期间找到最接近的匹配类型。从本质上讲,它将为您重写它,作为:

代码语言:javascript
复制
val a: List[Int] = ...

它将在编译时使用此参数类型信息来键入、检查代码,然后将其擦除,以便在程序中获得List[_]。这是因为JVM以这种方式工作--类型擦除。

当您在运行时在列表上设置匹配模式时,它的类型信息将被删除,因此任何List都会匹配。Scala编译器在编译过程中会警告您。

这在REPL和常规编译->运行周期中的工作方式是相同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21219827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档