To get a proper return future, do something like:

```scala
FutureOps.liftValues {
  mysqlResult.map { case (_, rows) => // map the future rather than calling get
    val rowMap = rows.toMap                // this shouldn't lose any data; because you were querying with a set of keys, we won't have dups
    CollectionOps.zipWith(ks) { rowMap.get(_) }  // This builds up a map that definitely contains the whole input key set
  }
} // liftValues will build the return map you need: https://github.com/twitter/storehaus/blob/develop/storehaus-core/src/main/scala/com/twitter/storehaus/FutureOps.scala#L88
```

This approach also keeps the types; you actually can't cast String -> K1, it's only the other way around that works. (Just like you can cast String -> Object, but not the other way.)