我们以此为例:
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()或者其他什么.
但是如果是这样的话,为什么我们可以在没有类标签的情况下进行模式匹配(在这种情况下我们无法区分擦除类型)?我的意思是,它是如何实现的,如果我宣布一个隐含的参数(这是由编译器自动提供),我得到一个行为,但如果我不这么做,我得到一个不同的行为?
我对这里发生的事情感到困惑:
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)