【问题标题】:Scala- How to get a Vector's contained class?Scala-如何获取向量的包含类?
【发布时间】:2018-03-05 17:32:26
【问题描述】:

Scala 是否有办法获取集合中包含的类?即如果我有:

val foo = Vector[Int]()

有没有办法从中取回 classOf[Int] ?

(仅检查第一个元素是行不通的,因为它可能是空的。)

【问题讨论】:

标签: scala reflection collections scala-collections


【解决方案1】:

你可以使用TypeTag:

import scala.reflect.runtime.universe._

def getType[F[_], A: TypeTag](as: F[A]) = typeOf[A]

val foo = Vector[Int]()
getType(foo)

【讨论】:

    【解决方案2】:

    不是从集合本身,但如果您从方法中获取参数,您可以在该方法中添加隐式TypeTag 以在运行时获取类型。例如

    def mymethod[T](x: Vector[T])(implicit tag: TypeTag[T]) = ...
    

    详情请见https://docs.scala-lang.org/.../typetags-manifests.html

    【讨论】:

      【解决方案3】:

      从技术上讲,您可以通过使用 Shapless 库中的 TypeTag 或 Typeable/TypeCase 来实现(请参阅link)。但我只想指出,所有这些技巧都是非常先进的解决方案,因为没有更好的方法可以在不挖掘内部类型参数的情况下完成任务。

      scala 和 java 中的所有类型参数都会受到运行时类型擦除的影响,如果您突然想到从类中提取这些信息,那么重新设计您正在尝试实现的解决方案可能是一个好兆头。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-02
        • 1970-01-01
        • 2012-09-15
        • 2019-02-26
        • 1970-01-01
        • 1970-01-01
        • 2011-12-29
        相关资源
        最近更新 更多