如何在scala中使用嵌套类型的泛型

时间:2015-03-18 03:27:59

标签: scala generics

我围绕一些火花代码构建一个小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。

1 个答案:

答案 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?