考虑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): - 如何通过以下约束来实现: -
我不想向SomeTrait添加类型参数(如SomeTrait [+ A]),因为SomeTrait在我们的代码库中被广泛使用而没有传递任何类型。
我不想改变y:列出[SubFoo]到List [Foo]。我正在寻找一个解决方案,在定义someFun的地方进行必要的更改。
最明显的是:不要将someFun更改为someFun(a:List [SubFoo],...) - >列出[SubFoo]。纳达
让我知道是否存在尊重约束或至少满足约束-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。