2014-07-09 90 views
2

我试图写一个简单的工具斯卡拉通用上限

def withParLevel[T, Col <: ParIterable[T]](coll: Col, ts: TaskSupport): Col = { 
    coll.tasksupport = ts 
    coll 
} 
withParLevel(List(1,2,3,4,5).par, blockingPool) 

这给了我这个错误:

inferred type arguments [Nothing,scala.collection.parallel.immutable.ParSeq[Int]] do not conform to method withParLevel's type parameter bounds [T,Col <: scala.collection.parallel.ParIterable[T]] 

我该如何解决呢?

为什么它推断T为Nothing,而不是Int?

PS scala版本2.10.2

+0

好奇,我不知道为什么类型推断在这里失败。我会等待有人解释这一点。与此同时,将它改为通配符('[T <:ParIterable [_]])或视图绑定('[A,B <%ParIterable [A]]')似乎可行... –

+0

I' d完全删除'Col'类型参数并使用子类型多形主义:'def withParLevel [T](coll:ParIterable [T]):ParIterable [T] = coll' –

回答

3

更改绑定到视图绑定的类型。 Scala编译器需要两个类型参数之间的证据表明,列=> scala.collection.parallel.ParIterable [T]

让我们快速REPL会话:(编译我没有使用TaskSupport PARAM)

$ scala 
Welcome to Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_05). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> import scala.collection.parallel.ParIterable 
import scala.collection.parallel.ParIterable 

scala> def withParLevel[T, Col <: ParIterable[T]](coll: Col): Col = coll 
withParLevel: [T, Col <: scala.collection.parallel.ParIterable[T]](coll: Col)Col 

让我们使用视图边界修复编译错误:

scala> def withParLevel[T, Col <% ParIterable[T]](coll: Col): Col = coll 
withParLevel: [T, Col](coll: Col)(implicit evidence$1: Col => scala.collection.parallel.ParIterable[T])Col 

scala> withParLevel(List(1,2,3,4,5).par) 
res0: scala.collection.parallel.immutable.ParSeq[Int] = ParVector(1, 2, 3, 4, 5) 

编辑: 原因:如果类型界限的一个驱动另一个(在你的情况,山口派生自T中的推理),你需要查看边界。

+0

似乎可行,但不清楚为什么类型绑定不起作用。所以一般的规则:如果你想要一些复杂的类型使用'<%'而不是'<:' – yura

+0

@yura:用实际原因更新了帖子。 –