当前位置: 首页 > 知识库问答 >
问题:

包含原语的Scala集合的安全强制转换

阎建中
2023-03-14

我正在从事混合JavaScala项目,并且经常需要转换集合。

当我想转换一个基元集合时,我应该写这样的东西

val coll: Seq[Int] = Seq(1, 2, 3)

import scala.collection.JavaConverters._

val jColl = coll.map(v => Int.box(v)).asJava

但是,我知道Java和Scala通用集合都使用装箱值,因此我可以安全地避免使用不必要的装箱进行迭代,只需编写

val jColl = coll.asJava.asInstanceOf[java.util.List[java.lang.Integer]]

然而,若我在集合类型或元素类型中出错,编译器不会抱怨。

有没有一种类型安全的方法可以避免额外的迭代?至少有一种方法可以检查集合类型吗?

共有1个答案

潘宸
2023-03-14

嗯,我想不出一种方法来避免scala。Int-

一种方法可能是:

import scala.language.higherKinds
implicit class IntCollectionBoxer[C[_] <: java.lang.Iterable[_]](elems: C[Int]) {
  def asJavaBoxed: C[java.lang.Integer] = elems.asInstanceOf[C[java.lang.Integer]]
}

(对于Double和其他类型重复此操作)

那么用法是这样的,这很难出错:

val jColl = coll.asJava.asJavaBoxed

您可能希望根据您的使用情况更改C的绑定。

 类似资料:
  • 隐含的强制转换 隐含的 强制转换是指这样的类型转换:它们是隐藏的,由于其他的动作隐含地发生的不明显的副作用。换句话说,任何(对你)不明显的类型转换都是 隐含的强制转换。 虽然 明确的 强制转换的目的很明白,但是这可能 太过 明显 —— 隐含的 强制转换拥有相反的目的:使代码更难理解。 从表面上来看,我相信这就是许多关于强制转换的愤怒的源头。绝大多数关于“JavaScript强制转换”的抱怨实际上都

  • 这是我的哈希图: 如何获得一个新的,它将包含每个客户的汽车数量,即的大小? 我想这样做没有循环,但只使用流。 我的尝试:

  • 编辑问题以包括所需的行为、特定的问题或错误,以及重现问题所需的最短代码。这将帮助其他人回答这个问题。 这是我的哈希映射: 如何获得一个新的,它将包含每个客户的汽车数量,即的大小? 我想不使用循环,但只使用流。 我的尝试:

  • 问题内容: 在我的spring应用程序上下文文件中,我有类似以下内容: 在java类中,实现如下所示: 在Eclipse中,我看到一条警告: 类型安全性:未经检查的从Object到HashMap的转换 我做错了什么?我该如何解决该问题? 问题答案: 好吧,首先,你正在通过新的HashMap创建调用浪费内存。你的第二行完全忽略了对此创建的哈希图的引用,从而使该哈希图可用于垃圾收集器。因此,不要这样做

  • 问题内容: 问题 与新HashSet(Collection)等效的Scala)相关,如何将Java集合(例如)转换为Scala集合? 我实际上是在尝试将Java API调用转换为Spring的 (返回a )成Scala不可变。因此,例如: 这似乎有效。欢迎批评! 问题答案: 您的最后一条建议有效,但您也可以避免使用: 请注意,默认情况下,由于提供了此功能。

  • 本文向大家介绍Scala将Scala集合转换为Java集合,反之亦然,包括了Scala将Scala集合转换为Java集合,反之亦然的使用技巧和注意事项,需要的朋友参考一下 示例 当您需要将集合传递到Java方法中时: 如果Java代码返回Java集合,则可以通过类似的方式将其转换为Scala集合: 请注意,这些是装饰器,因此它们仅将基础集合包装在Scala或Java集合接口中。因此,通话.asJa