【发布时间】:2016-03-04 17:48:03
【问题描述】:
我知道隐式在编译期间已解决,所以我想我正在寻找以下解决方法。假设我有一个带有这个签名的方法:
class MyClass {
def run[X](x: X)(implicit runnable: Runnable[X]) = runnable(x)
}
我想把它包起来:
class MyClassWrapper[Z: ClassTag] {
val rdd: RDD[Z] = //Spark RDD
def runWrapper[X](fun: Z => X) = rdd.foreach( (el:Z) => new MyClass.run(fun(el)))
}
这不会编译抱怨无法找到隐式。我可以将签名更改为:
def runWrapper[X](fun: Z => X)(implicit runnable: Runnable[X])
所有都可以编译,但我使用的是 Spark,它不允许从外部的操作内部捕获不可序列化的对象(在我的情况下,run 将捕获来自runWrapper 的隐式参数)所以我确实需要获取/创建隐式 inside run,而不是从外部将其关闭。那可能吗?
【问题讨论】:
-
创建类时不能获取参数吗?即
MyClassWrapper[Z](implicit runnable: Runnable[Z])?当Z的类型已知时,需要解析implicit。 -
@yw3410 它需要
X的runnable(fun函数的结果),而不是Z,因此它在MyClassWrapper创建时不可用。 -
我不相信这是可能的,因为
implicit在解决之前需要是已知类型。但是,我认为如果您知道X的所有可能值(如果有点混乱),您将能够获得您想要的行为。你知道X的所有可能类型吗? -
我可以浏览库的源代码并获得它们,但这并不是我真正想要的解决方案。
标签: scala apache-spark implicit