当前位置:  开发笔记 > 编程语言 > 正文

用于转换为并行集合的通用类型参数

如何解决《用于转换为并行集合的通用类型参数》经验,为你挑选了1个好方法。

我有这个函数转换Array为a ParArray,给出线程数作为参数:

def parN[T](collection: Array[T], n: Int) = {
    val parCollection = collection.par
    parCollection.tasksupport = new ForkJoinTaskSupport(
      new concurrent.forkjoin.ForkJoinPool(n))
    parCollection
}

现在我想使这个通用,这样它适用于除Array以下之外的集合:

def parN[S, T[S] <: Parallelizable[S, ParIterable[S]]](collection: T[S], n: Int) = {
    val parCollection = collection.par
    parCollection.tasksupport = new ForkJoinTaskSupport(
      new concurrent.forkjoin.ForkJoinPool(n))
    parCollection
}

但是当我调用它时parN(Array(1, 2, 3), 2),我收到此错误:

inferred type arguments [Int,Array] do not
conform to method parN's type parameter bounds
[S,T[S] <: scala.collection.Parallelizable[S,scala.collection.parallel.ParIterable[S]]]

另一方面,这是有效的:

val x: Parallelizable[Int, ParIterable[Int]] = Array(1, 2, 3)

任何想法我的类型参数可能有什么问题?



1> gourlaysama..:

首先,请注意这是一个特定于Array以下问题的问题:您的方法适用于List或任何其他正常集合(具有多个类型参数的那些,或者没有).例:

scala> parN(List(1,2,3), 2)
res17: scala.collection.parallel.ParIterable[Int] = ParVector(1, 2, 3)

scala> parN(Set(1,2,3), 2)
res18: scala.collection.parallel.ParIterable[Int] = ParSet(1, 2, 3)

Array在集合方面总是一个特例,因为......它不是一个集合.因为Java,它的定义是final class Array[T] extends Serializable with Cloneable.但是,在任何地方都存在两个可以转换Array为集合类型(ArrayOpsWrappedArray)的含义.并且这些类型确实实现了Parallelizable,所以一切都应该没问题......除了类型推断阻碍:

你的类型参数只被定义为T[S],所以当收到Array[Int]它时,它会很乐意推断Array[Int],然后检查边界:失败,Array不扩展Parallelizable.游戏结束.

我看到两个选择:

你可以明确地说你想要一个Parallelizable:

def parN[S](collection: Parallelizable[S, ParIterable[S]], n: Int)

或者,如果您需要访问实际类型T(在您的情况下没有,但谁知道):

def parN[S, T[S] <: Parallelizable[S, ParIterable[S]]](collection: T[S] with
   Parallelizable[S, ParIterable[S]], n: Int)

或者您可以Parallelizable使用隐式参数接受任何可以隐式转换为a的内容:

def parN[S, T <% Parallelizable[S, ParIterable[S]]](collection: T, n: Int)

这是简短的版本:

def parN[S, T](collection: T, n: Int)(implicit ev: T => 
  Parallelizable[S, ParIterable[S]])

所有这些都应该奏效.在你的情况下,我会推荐第一个:它是最可读的工作.

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有