Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between Future[Any] and Future[_]

Tags:

scala

future

Okay, I guess question is already complete in the title. Nothing big, but I am just wondering. I have a method which returns either a correct value or an error code enum item. For example something like this:

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

Where db.queryMyData() returns a Future, and data.doStuff() just modifies the data.

Now I have intuitively written Future[_], cause the return value is flexible. But when looking in other libraries I've seen Future[Any] used. Which seems to be logic too, when you use a match-case on the return of the function to check which data it is.

The code which uses that is for example something like this:

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

So, my questions is: What's the difference between the use of Any or _ here, and why should I use the correct one?

like image 703
Wolfsblvt Avatar asked Sep 25 '22 14:09

Wolfsblvt


1 Answers

It is a matter of semantics:

The Existential TypeT[_] means there is a class/type at the position of _ for which I do not care at all but it must be there.

T[Any] means there has to be a subclass Any present.

The difference comes into play when you want to serialize the underlying class. If you just use _ without any typebounds you will not be able to use some of the many Scala JSON libraries.

like image 93
Andreas Neumann Avatar answered Nov 02 '22 20:11

Andreas Neumann