Yeah, @Asynchronous methods have to return a Future<> or are void.
Since we do have control over the interfaces, I don't think we need the annotation - although I suppose we could play with signatures like this:
Container<K,V> {
<T> T get(K);
}
With this structure, T would implement either V or Future<V>, and get() would determine what to do based on the actual type passed in.
That's not to say that this sounds wise, or doable, or whatever - just trying to think through the applications. I still think having two interfaces (Container<K, V> and AsyncContainer<K, V> extends Container<K, V>) makes the most sense - or if I didn't think it before, I do now. :)