code: public static <V> void addCallback(
        ListenableFuture<V> future, FutureCallback<? super V> callback) {
      addCallback(future, callback, directExecutor());
    }
docs: Registers separate success and failure callbacks to be run when the {@code Future}'s
  computation is {@linkplain java.util.concurrent.Future#isDone() complete} or, if the
  computation is already complete, immediately.
  
  <p>There is no guaranteed ordering of execution of callbacks, but any callback added through
  this method is guaranteed to be called once the computation is complete.
  
  Example: <pre> {@code
  ListenableFuture<QueryResult> future = ...;
  addCallback(future,
  new FutureCallback<QueryResult>() {
  public void onSuccess(QueryResult result) {
  storeInCache(result);
  }
  public void onFailure(Throwable t) {
  reportError(t);
  }
  });}</pre>
  
  <p>This overload, which does not accept an executor, uses {@code directExecutor}, a dangerous
  choice in some cases. See the discussion in the {@link ListenableFuture#addListener
  ListenableFuture.addListener} documentation.
  
  <p>For a more general interface to attach a completion listener to a {@code Future}, see {@link
  ListenableFuture#addListener addListener}.
  
  @param future The future attach the callback to.
  @param callback The callback to invoke when {@code future} is completed.
  @since 10.0