The reasons lie in the white paper :
A future trait implements a recognized trait using the ready () and result () methods. These methods cannot be called directly by clients - they can only be called by the execution context.
Thus, library developers force you to use these methods in an appropriate environment (execution context , possibly a third-party , or through an awaitable object to explicitly indicate locking operations).
source share