Scala - 泛型类的非泛型包装器

时间:2015-07-28 20:39:45

标签: scala generics wrapper type-erasure

我们说我有一个案例类

case class Foo[T<:Bar[T]](t:T)

我有一个

case class FooWrapper[T<:Bar[T]](foos:Seq[Foo[T]])

到目前为止,非常好。

不幸的是,我现在想在一个我无法访问用于构造它们的T的环境中合并两个FooWrapprs。即尝试这样的事情:

def merge(fw1:FooWrapper,fw2:FooWrapper) = {
    FooWrapper(fw1.foos ++ fw2.foos)
}

显然,用于构造fw1,fw2的T可能会有所不同,这就是合并失败的原因。

也许我太累了,看不到明显的,但是什么是克服这种限制的正确方法?让包装类本身实现合并方法工作还是可以忘记由于类型擦除?

修改

我想要这样的合并方法:

case class FooWrapper[T<:Bar[T]](foos:Seq[Foo[T]]){
    def merge(other:FooWrapper[T]) = FooWrapper[T](this.foos ++ other.foos)
}

然后

def doSomethingWith(w1:FooWrapper,w2:FooWrapper) ={
    w1.merge(w2)
}

这编译很好,可能会有效,但我不确定我是否可以依赖它的正常工作。

1 个答案:

答案 0 :(得分:1)

您可以强制执行fw1和fw2类型的等效:

merge

否则,请指定您期望{{1}}方法的结果类型?