2016-01-22 64 views
3

好的,我想问题已经在标题中完成了。 没什么大的,但我只是想知道。我有一个方法返回一个正确的值或错误代码枚举项。例如这样的事情:未来[任何]和未来之间的区别[_]

def doMyStuff(): Future[_] = { 
    val result = db.queryMyData().map { 
     case some(data) => 
      val modifiedData = data.doStuff() 
      modifiedData 
     case None => 
      Errors.THIS_IS_FALSE 
    } 
    result 
} 

db.queryMyData()返回一个未来,而只是data.doStuff()修改数据。

现在我直观地写了Future[_],导致返回值很灵活。但是,当我在其他库中查看时,我已经看到使用了Future[Any]。这似乎也是逻辑,当你在函数返回时使用一个匹配的情况来检查它是哪个数据。

它使用的代码,例如这样的事情:

doMyStuff().map { 
    case data: MyDataType => // Blah blah 
    case Errors.Value => // error handling 
} 

所以,我的问题是:什么是使用任何的区别_这里,为什么我应该使用正确一个?

+0

我想关闭这个有利于它是重复的:http://stackoverflow.com/questions/15186520/scala-any-vs-underscore-in-generics。我有金锤,所以我想在获得其他人的反馈意见之前将其标记为重复并因此将其关闭。 – cmbaxter

+0

我只是想建议使用'任何[错误,数据]'而不是'任何' –

+0

@Łukasz:如果只有两个可能的返回类型,就像这个例子中的任何一个都可以工作。而且要么看起来不那么干净*并且对我来说是可读的,尤其是对于匹配中的'左(blah)'情况。或者当使用'Either'时真正的优势是什么? – Wolfsblvt

回答

2

这是一个语义学问题:

生存型T[_]意味着还有一类/类型为_对此我完全不关心,但它必须在那里的位置。

T[Any]表示必须存在子类Any

当您想要序列化底层类时,区别就在于此。 如果你只使用_而没有任何类型的绑定,你将无法使用一些Scala JSON库。

+0

谢谢,这有助于我更多地理解。'_'意思是我不在乎,“Any”意味着我在乎,但它可能是一切。所以在我的例子中,它会是什么?我想任何会更正确? (哦,有点偏离主题,但你的最后一段,这是否意味着你可以序列化任何?) – Wolfsblvt

+1

另一个尝试说明它:'T [Any]'意味着“在编译时,我们确信在运行时,价值可能是任何东西“。 'T [_]'的意思是“也许我们在这里有一些编译时的知识,也许我们不这样做,没关系。” –

+0

是的。如果有疑问,我会选择“任何”。 –

相关问题