Scala 未来[任何]与未来[的]之间的差异
好的,我想题目中的问题已经完成了。 没什么大不了的,但我只是想知道。我有一个返回正确值或错误代码枚举项的方法。例如,类似这样的事情:Scala 未来[任何]与未来[的]之间的差异,scala,future,Scala,Future,好的,我想题目中的问题已经完成了。 没什么大不了的,但我只是想知道。我有一个返回正确值或错误代码枚举项的方法。例如,类似这样的事情: def doMyStuff(): Future[_] = { val result = db.queryMyData().map { case some(data) => val modifiedData = data.doStuff() modifiedData cas
def doMyStuff(): Future[_] = {
val result = db.queryMyData().map {
case some(data) =>
val modifiedData = data.doStuff()
modifiedData
case None =>
Errors.THIS_IS_FALSE
}
result
}
doMyStuff().map {
case data: MyDataType => // Blah blah
case Errors.Value => // error handling
}
其中db.queryMyData()
返回未来,而data.doStuff()
只是修改数据
现在我直观地编写了Future[\u]
,因为返回值是灵活的。但是在查看其他库时,我看到了使用的Future[Any]
。这似乎也是逻辑,当您在函数返回时使用匹配案例来检查它是哪些数据时
例如,使用它的代码如下所示:
def doMyStuff(): Future[_] = {
val result = db.queryMyData().map {
case some(data) =>
val modifiedData = data.doStuff()
modifiedData
case None =>
Errors.THIS_IS_FALSE
}
result
}
doMyStuff().map {
case data: MyDataType => // Blah blah
case Errors.Value => // error handling
}
因此,我的问题是:在这里使用Any或有什么区别,为什么我应该使用正确的方法?这是一个语义问题: 存在类型
T[\u]
意味着在\u
的位置上有一个类/类型,我根本不关心它,但它必须在那里
T[Any]
表示必须存在子类Any
当您想要序列化底层类时,这种差异就开始发挥作用。
如果您只使用
\uuu
而不使用任何类型边界,您将无法使用许多Scala JSON库中的某些库。我正在考虑关闭此库,以使其与:。我有金锤,所以我想在将其标记为副本并关闭它之前获得其他人的反馈。我只是想建议使用或[Error,Data]
而不是任何
@ukasz:如果它只是两种可能的返回类型(如该示例中所示),那么这两种返回类型都可以工作。对我来说,这两种方法看起来都不那么干净和易读,尤其是搭配中的左格(废话)
东西。或者使用或的真正优势是什么?@cmbaxter这是一个非常复杂的问题/答案,我觉得它不能回答我的问题。但也许我就是不明白那里的东西。它不能回答在我的情况下更喜欢使用什么,是吗?@cmbaxter,我不会;这是一个更复杂的案件。还有一个更接近的例子,虽然Set
不是协变的。谢谢,这有助于我进一步理解
表示我不在乎,Any
表示我在乎,但它可以是一切。那么在我的例子中,会是什么?我想有更正确的吗?(哦,有点离题了,但你的最后一段,这是否意味着你可以序列化Any
?)另一次尝试陈述:T[Any]
意味着“在编译时,我们可以确定在运行时,值可能是任何值”T[\u]
的意思是“也许我们在这里有一些编译时知识,也许我们没有,这两种方式都很好”。是的。如果有疑问,我会选择Any
。您肯定无法序列化。
。