确定Manofst [T]的T是否是一个集合

 lmc的 发布于 2023-02-10 11:22

目前我有这个:

private def isCollectionLike[T](manifest: Manifest[T]):Boolean = {
   manifest.runtimeClass.toString.contains("scala.collection")
}

我不喜欢这个解决方案,你能说一个更好的解决方案吗?

1 个回答
  • 只是打电话Class#isAssignable应该足够了:

    def isCollectionLike[T](manifest: Manifest[T]):Boolean = {
      classOf[scala.collection.TraversableLike[_,_]].isAssignableFrom(manifest.runtimeClass)
    }
    

    强制REPL测试:

    scala> isCollectionLike(manifest[List[Int]])
    res17: Boolean = true
    
    scala> isCollectionLike(manifest[String])
    res18: Boolean = false
    
    scala> isCollectionLike(manifest[scala.collection.SeqLike[Int,_]])
    res19: Boolean = true
    

    请注意,这不适用于数组,原因很简单,scala数组现在(因为scala 2.8)直接映射到udnerlying JVM数组,因此不会继承TraversableLike(如果感兴趣,可以查看http:/ /docs.scala-lang.org/sips/completed/scala-2-8-arrays.html).

    scala> isCollectionLike(manifest[Array[String]])
    res20: Boolean = false
    

    因此,您必须将其作为特殊情况处理,或者找到更好的方法来测试集合.

    作为旁注,这些天有一个替代java反射scala自己的反射api(另外有人Manifest赞成使用TypeTag),它具有理解所有scala特定功能的巨大优势(该Class实例重新运行时runtimeClass不知道任何事情)关于斯卡拉).但它也更复杂,而且(目前)根本不是线程安全的,这是一个主要的限制.

    另外,在您的情况下,您仍然需要处理数组作为特殊情况.

    2023-02-10 11:27 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有