【问题标题】:Comparing reflected collection types in Scala比较 Scala 中的反射集合类型
【发布时间】:2015-03-18 00:53:08
【问题描述】:

我有一个反射集合类型,我需要比较它是否是某种集合。我该怎么做?

val a = List(1,2,3)
val b = currentMirror.classSymbol(a.getClass).typeSignature
println("Q? "+ (b =:= typeOf[List[_]]))

当然,这总是错误的。在实践中,我有一个集合列表,用 _ 概括。我需要知道给定的类型(通常在其参数中是特定的)是否是这些集合之一。例如,我需要知道 List[Int] 是否是 List[_]。

实际情况是这样的:泛型类型的映射 -> 我需要的函数:

val collectionHandlers = Map(
    typeOf[scala.collection.immutable.List[_]] -> fnList,
    typeOf[scala.collection.immutable.Map[_,_]] -> fnMap,
    //...
)
val aListType = // something here that is a TypeSignature of List[Int] as above
collectionHandlers( _magicClean(aListType) )()

_magicClean 是我需要帮助的地方。如何“概括”特定类型的集合,以便地图查找起作用?

【问题讨论】:

    标签: scala reflection


    【解决方案1】:

    问题是aclassSymbol::。它也不包含所包含类型 Int 的类型信息(toString 仅显示泛型)。

    说,如果我们有这样的方法:

    def typeTagOf[A](a: A)(implicit tt: TypeTag[A]) = tt
    

    我们可以用它来得到a的确切Type,并与typeOf[List[_]]进行比较。

    scala> typeTagOf(a).tpe <:< typeOf[List[_]]
    res165: Boolean = true
    
    scala> typeTagOf(1).tpe <:< typeOf[List[_]]
    res166: Boolean = false
    

    List[Int]List[_]真的,这就是我使用&lt;:&lt; 而不是=:= 的原因。也就是说,List[Int]List[_] 的子类型,但它们并不完全相同。目前还不清楚你需要这个做什么。如果您只匹配集合类型(没有内部类型),您可能可以使用List[_] 等。但有一些警告。例如,如果你有这个:

    val list: List[_] = List(1, 2, 3)
    

    您无法恢复类型信息并证明它是仅包含 Ints 的列表,因为 _ 是存在类型。

    scala> typeTagOf(list)
    res170: reflect.runtime.universe.TypeTag[List[_$1]] forSome { type _$1 } = TypeTag[scala.List[_$1]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 2021-07-31
      相关资源
      最近更新 更多