加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 方法如何接受(T <:Seq)[A]并返回T [B] - 具有不同

发布时间:2020-12-16 08:48:09 所属栏目:安全 来源:网络整理
导读:参见英文答案 Returning same collection type,differently parameterised????????????????????????????????????1个 我想实现一个接受一个元素类型的序列并返回不同元素类型的序列的方法.我如何一般地这样做,以便返回相同的Sequence子类? 我的方法目前看起
参见英文答案 > Returning same collection type,differently parameterised????????????????????????????????????1个
我想实现一个接受一个元素类型的序列并返回不同元素类型的序列的方法.我如何一般地这样做,以便返回相同的Sequence子类?

我的方法目前看起来像这样:

def lookerUpper(ids : Seq[String],someOtherInfo : Int) : Seq[UsefulData] = {
    ... retrieve data for each id ...
}

我希望它更通用,因此传入任何类型的(字符串)序列也是返回的(UsefulData)序列.矢量和列表,尤其是,或者我们可以做到的一般.

这可以用Scala的类型系统表达吗? “返回与此参数相同的类型,但使用不同的类型参数.”

解决方法

要获得完整的答案,您应该查看我的相当长的问题并回答有关构建器的问题(注意:截至2012年9月,Miles的备用版本在2.9或最新的2.10中都不起作用).

这是一个让你入门的框架(注意显式和隐式参数块的奇怪格式,以避免在SO上显示过长的行):

import collection.generic.CanBuildFrom

case class UsefulData(data: Int) {}

def lookerUpper[C[String]](
  ids: C[String],someOtherInfo: Int
)(
  implicit cbf: CanBuildFrom[C[String],UsefulData,C[UsefulData]],ev: C[String] => Iterable[String]
): C[UsefulData] = {
  val b = cbf()
  val i = ev(ids)
  i.foreach{ s => b += UsefulData(s.length + someOtherInfo) }
  b.result 
}

并观察它的工作原理:

scala> lookerUpper(Vector("salmon","cod"),2)
res0: scala.collection.immutable.Vector[UsefulData] = 
  Vector(UsefulData(8),UsefulData(5))

scala> lookerUpper(Array("salmon",2)
res1: Array[UsefulData] = 
  Array(UsefulData(8),UsefulData(5))

编辑:如果您只关心TraversableLike的子类(哪个Array不是),并且您将使用标准集合操作来完成所有工作,那么您可以使用answer to 8609398作为Luigi指出的. (也许我应该把这个答案作为另一种观点转移到那里.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读