如何将多态类型变量绑定到Scala中的一元类型构造函数的参数?
def f[CollectionOfE] = new Blah[...]
{
def g(a: E) =
{ ... }
}
...
val x = f[Set[Int]] // want E above to bind to Int
在 g 的定义中,我希望能够引用已经实例化 f 的集合的参数类型。
我试过了:
def f[C[E]] = new Blah[...] ...
但是E的范围似乎是[
... ]
的本地范围,如果这有任何意义......
答案 0 :(得分:1)
如果您将E
定义为单独的参数,则可以执行此操作。 E.g。
def f[E, C <: util.Collection[E]] = new Blah {
def g(a: E) = ...
}
val x = f[Int, Set[Int]].g(1) // compiles
val y = f[Int, Set[Int]].g("string") // doesn't compile
修改强> 您可以通过使用下划线调用函数来使其更简洁:
f[Int, Set[_]].g(1)
答案 1 :(得分:0)
如果我理解你的意图,你可能需要这样的东西:
def f[E, C[_]] = new Blah[...] {
def g(e: E) = ???
}
...
f[Int, Set]
基本上,如果您想稍后引用某个类型,则需要将其作为单独的类型参数。您可能还希望将C[_]
的类型限制为某个集合。