如何制作列表协变: - scala

时间:2017-09-22 01:22:03

标签: scala

考虑SubFoo扩展Foo。我有这样的结构

trait SomeTrait
{

def someFun(a : List[Foo], ...) -> List[Foo]
.
.
.
}

现在在我的代码中我想做y:List [SubFoo] = someFun(List(x),...)其中x:SubFoo和 y应该是List [SubFoo] 。但我得到错误消息预期List(SubFoo),实际:List(Foo): - 如何通过以下约束来实现: -

  1. 我不想向SomeTrait添加类型参数(如SomeTrait [+ A]),因为SomeTrait在我们的代码库中被广泛使用而没有传递任何类型。

  2. 我不想改变y:列出[SubFoo]到List [Foo]。我正在寻找一个解决方案,在定义someFun的地方进行必要的更改。

  3. 最明显的是:不要将someFun更改为someFun(a:List [SubFoo],...) - >列出[SubFoo]。纳达

  4. 让我知道是否存在尊重约束或至少满足约束-1的解决方案。

    由于

1 个答案:

答案 0 :(得分:1)

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

在不了解您的问题的情况下,听起来您正在尝试获取SubFoo的子列表,其中子列表完全由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]

转换为

List[Foo]

出于某种原因存在类型签名。如果您要将List[SubFoo]转换为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[SubFoo]减少到List[Foo]的函数。您不能拥有Foo类型,并保证类型系统中的每个SubFoo都是SubFoo。如果你需要这样的东西,你很可能不得不重新考虑你的类型层次结构。

记住继承的基本结构。所有Foo都是Foo s,但并非所有SubFoo都是$scope.currentEvent = Object { item_id: "10535", name: "johnny", user_type: "1",category_id: "5"}, Object { item_id: "10534", name: "smith", user_type: "1",category_id: "6"}, Object { item_id: "10536", name: "Greg", user_type: "1",category_id: "7"}; $scope.users = Object { item_id: "11355", name: "mathew", user_type: "1",category_id: "7"}, Object { item_id: "10336", name: "Greg", user_type: "2",category_id: "7"}, Object { item_id: "10545", name: "powell", user_type: "1",category_id: "7"}, Object { item_id: "10456", name: "micheal", user_type: "3",category_id: "7"}; s。