gpt4 book ai didi

java - 在 Scala 中为 Java 对象创建隐式 View 的最佳方法

转载 作者:行者123 更新时间:2023-12-02 02:31:21 24 4
gpt4 key购买 nike

我正在使用 Java 库。这个库有一堆集合,我想在我的 Scala 代码中拥有隐式 View 。 Java 库的对象模型遵循如下模式:

(NarrowStreet | WideStreet) extends Street extends Road extends TwoNode

StreetList extends java.util.AbstractList< Street>

RoadList extends java.util.AbstractList< Road>

等等。一个StreetList实际上的行为就像 List<Street> .

我需要使用此库中具有以下签名的方法:

List<StreetList> city.getStreets();

在 Scala 中,我执行以下操作来隐式访问 Seq[Street] Collection :

implicit def twoNodeView[T <: java.util.AbstractList[_ <: TwoNode]](x : T): Seq[_ <: TwoNode] = for(i <- 0 until x.size()) yield x.get(i)

现在当我这样做的时候

city.getStreets.asScala.flatten //.map, .filter, etc.

它给了我一个Seq[TwoNode] 。当我在 map 中使用集合时,我转换了对象或filter函数,我认为我是安全的,因为我 100% 确定这个对象是 Seq[Street]而不是真正的Seq[TwoNode] .

问题:

  1. 我实现隐式 View 的方式是否存在失败情况?

  2. 这是否可以改进,或者是否有更好的方法来实现相同的结果并避免强制转换?

最佳答案

您不需要为此定义自己的隐式。只需使用

city.getStreets.asScala.map(_.asScala)

获取嵌套的Buffer[Buffer[Street]],然后根据需要.flatten将其放入Seq[Street]中。

关于java - 在 Scala 中为 Java 对象创建隐式 View 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47029891/

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