首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala中的Erasure类型

Scala中的Erasure类型
EN

Stack Overflow用户
提问于 2016-07-25 14:49:52
回答 1查看 4.4K关注 0票数 4

我对这里发生了什么感到很困惑:

代码语言:javascript
复制
import scala.collection.immutable._

object Main extends App {
  sealed trait Node

  sealed trait Group

  case class Sheet(
    val splat: String,
    val charname: String, 
    val children: ListMap[String, Node],
    val params0: ListMap[String, Param], //params0 to separate sheet-general parameters

    val note: Option[Note]
    ) extends Node with Group

  case class Attributes(val name: String) extends Node with Group

  case class Param(val name: String, val value: String) extends Node
  case class Note(val note: String) extends Node

我有三个版本的替换函数--最后一个是我正在尝试编写的版本,其他版本只是调试。

代码语言:javascript
复制
  class SheetUpdater(s: Sheet) {    
    def replace1[T <: Group](g: T): Unit = {
      s.children.head match {
        case (_, _:Sheet) =>
        case (_, _:Attributes) =>
      }
    }
  }

此版本不引发警告,因此显然我可以在运行时访问该类型的s.children

代码语言:javascript
复制
  class SheetUpdater(s: Sheet) {
    def replace2[T <: Group](g: T): Unit = {
      g match {
        case _:Sheet =>
        case _:Attributes =>
      }
    }
  }

这个版本也没有,所以显然g类型的细节在运行时也是可用的.

代码语言:javascript
复制
  class SheetUpdater(s: Sheet) {
    def replace3[T <: Group](g: T): Unit = {
      s.children.head match {
        case (_, _:T) => //!
        case (_, _:Attributes) =>
      }
    }
  }

..。但即便如此,这最终还是给了我可怕的Abstract type pattern T is unchecked since it is eliminated by erasure警告。这里发生了什么事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-25 15:49:14

在Scala中,泛型在运行时被删除,这意味着List[Int]List[Boolean]的运行时类型实际上是相同的。这是因为JVM作为一个整体擦除泛型类型。所有这些都是因为JVM希望在泛型首次引入时保持向后兼容的方式.

在Scala中有一种使用ClassTag的方法,它是一个隐式参数,然后可以使用您使用的任何泛型来线程化。

您可以将: ClassTag看作是将泛型类型作为参数传递。(它是传递ClassTag[T]类型隐式参数的语法糖。)

代码语言:javascript
复制
import scala.reflect.ClassTag

class SheetUpdater(s: Sheet) {
  def replace3[T <: Group : ClassTag](g: T): Unit = {
    s.children.head match {
      case (_, _:T) => //!
      case (_, _:Attributes) =>
    }
  }
}

Newer answers of this question have more details.

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

https://stackoverflow.com/questions/38570948

复制
相关文章

相似问题

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