我围绕一些火花代码构建一个小API,我发现自己创建了如下特征:
trait DataSource[T, F] {
def run(config: DataSourceConfig[T,F]): DataSourceResource[F]
}
取T型代表RDD [F]。你看到这个问题吗?这里令人讨厌,不得不迫使用户定义这两种类型:
class MySource extends DataSource[RDD[String], String] {
}
我理解scala在泛型方面有一些黑魔法可能允许我指定F实际上是嵌套在T中的类型,但我似乎无法弄清楚它是如何完成的。
Thing is-T也可以是DStream [String]。 RDD和DStream不从相同的特征或基类继承。
有什么想法吗?如果我可以指定F嵌套在T中并且仍然可以在任何地方使用F,它会真正清理我的API。
答案 0 :(得分:1)
嗯,这似乎有效:
import scala.language.higherKinds
trait DataSource[A[_], B] {
def foo(x: A[B]): Unit
}
class MySource extends DataSource[List, String] {
def foo(x: List[String]) = println(s"$x")
}
但我期待看到其他人是否可以指出如何进一步限制DataSource以便只允许A [B](不知何故!)。
编辑:这里有关于scala高级类推理的讨论: What are the limitations on inference of higher-kinded types in Scala?