如何使列表协变:-scala

如何使列表协变:-scala,scala,Scala,考虑subfo扩展Foo。我有一个这样的结构 trait SomeTrait { def someFun(a : List[Foo], ...) -> List[Foo] . . . } 现在在我的代码中,我想做y:List[subfo]=someFunListx,。。。其中x:subfo和y应为List[subfo]类型。但我收到了错误消息expected ListSubFoo,actual:ListFoo:- 在以下限制条件下,我如何做到这一点:- 我不想将类型参数添加到SomeT

考虑subfo扩展Foo。我有一个这样的结构

trait SomeTrait
{

def someFun(a : List[Foo], ...) -> List[Foo]
.
.
.
}
现在在我的代码中,我想做y:List[subfo]=someFunListx,。。。其中x:subfo和y应为List[subfo]类型。但我收到了错误消息expected ListSubFoo,actual:ListFoo:- 在以下限制条件下,我如何做到这一点:-

我不想将类型参数添加到SomeTrait,比如SomeTrait[+a],因为SomeTrait在我们的代码库中被广泛使用,而不传递任何类型

我不想将y:List[subfo]更改为List[Foo]。我正在寻找一个解决方案,在定义someFun的地方进行必要的更改

最明显的是:不要将someFun更改为someFuna:List[subfo],…->列表[subfo]。娜达

让我知道是否有关于约束的解决方案或至少满足约束-1的解决方案


谢谢

如评论中所述,差异不是你的方式。列表是协变的

在不了解您的问题的情况下,听起来您正在尝试获取某个[Foo]的子列表,其中子列表完全由子操作组成

如此给定

sealed trait Foo
case class SubFoo(baz: Int) extends Foo
case class OtherSubFoo(bam: String) extends Foo
听起来你想要一份

List(SubFoo(1), SubFoo(2), OtherSubFoo("a"), SubFoo(25)): List[Foo]
转化为

List(SubFoo(1), SubFoo(2), SubFoo(25)): List[SubFoo]
类型签名的存在是有原因的。如果试图将列表[Foo]转换为列表[subfo],则需要转换函数类型来反映这一点。以下是您可能要做的事情:

trait SomeTrait {

  def someFun(foos: List[Foo]): List[SubFoo] = {

    val listOfSubFoos = foos.map {
      case (sub: SubFoo) => Some(sub)
      case _ => None
    }

    // now you have a list of type List[Option[SubFoo]],
    // and want to flatten it to a List[SubFoo]
    listOfSubFoos.flatten
  }
}
还有其他的方法来构造它,但这里的核心思想是,您需要一个将List[Foo]简化为List[subfo]的函数。您不能拥有类型列表[Foo]并保证每个Foo都是类型系统中的子对象。如果您需要类似的东西,您很可能需要在这里重新考虑您的类型层次结构


请记住继承的基本结构。所有的子类都是foo,但不是所有的foo都是子类。

def someFun[T方差不是你的方式。列表是协变的。List[SubClass]是List[SomeClass]的一个子类型,如果子类Foos.collect{case sub:subfo=>sub},但我严重怀疑这是OP想要的