gpt4 book ai didi

scala - 确定 Manifest[T] 的 T 是否是一个集合

转载 作者:行者123 更新时间:2023-12-04 17:35:35 28 4
gpt4 key购买 nike

目前我有这个:

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

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

最佳答案

只需调用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 开始)直接映射到底层 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 重传,对 scala 一无所知)。
但它也更复杂,并且(当前)根本不是线程安全的,这是一个主要限制。

另外,在您的情况下,您仍然必须将数组作为特殊情况处理。

关于scala - 确定 Manifest[T] 的 T 是否是一个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20606267/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com