相关疑难解决方法(0)

模式匹配中的隐式ClassTag

我们以此为例:

import scala.reflect._

def get[T](list: List[Any])(implicit tag: ClassTag[T]) = {
  list.flatMap {
    case element: T => Some(element)
    case _ => None
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以用来从列表中get()获取类型的值T(例如,get[String](list)将从该列表中给出所有字符串).

现在,我明白编译器会ClassTag[String]自动提供类型的值.我也明白这ClassTag是一个类型类,在幕后的某处,有一段代码可以说implicitly[ClassTag[T]].getRuntimeClass()或者其他什么.

但是如果是这样的话,为什么我们可以在没有类标签的情况下进行模式匹配(在这种情况下我们无法区分擦除类型)?我的意思是,它是如何实现的,如果我宣布一个隐含的参数(这是由编译器自动提供),我得到一个行为,但如果我不这么做,我得到一个不同的行为?

reflection scala

5
推荐指数
1
解决办法
2746
查看次数

在Scala中键入Erasure

我对这里发生的事情感到困惑:

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
Run Code Online (Sandbox Code Playgroud)

我有三个版本的替换功能 - 最后一个是我实际上要编写的,其他只是调试.

  class SheetUpdater(s: Sheet) {    
    def replace1[T <: …
Run Code Online (Sandbox Code Playgroud)

scala type-erasure

3
推荐指数
1
解决办法
3185
查看次数

标签 统计

scala ×2

reflection ×1

type-erasure ×1