【问题标题】:Scala - non-generic wrapper for generic classesScala - 泛型类的非泛型包装器
【发布时间】:2015-07-28 20:39:44
【问题描述】:

假设我有一个案例类

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

我有一个

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

到目前为止,一切都很好。

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

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)
}

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

【问题讨论】:

    标签: scala generics wrapper type-erasure


    【解决方案1】:

    您可以像这样强制 fw1 和 fw2 的类型等价:

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

    否则,请指定merge 方法的结果是什么类型?

    【讨论】:

      猜你喜欢
      • 2017-07-14
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多