code: private V getDoneValue(Object obj) throws ExecutionException {
      // While this seems like it might be too branch-y, simple benchmarking proves it to be
      // unmeasurable (comparing done AbstractFutures with immediateFuture)
      if (obj instanceof Cancellation) {
        throw cancellationExceptionWithCause("Task was cancelled.", ((Cancellation) obj).cause);
      } else if (obj instanceof Failure) {
        throw new ExecutionException(((Failure) obj).exception);
      } else if (obj == NULL) {
        return null;
      } else {
        @SuppressWarnings("unchecked") // this is the only other option
        V asV = (V) obj;
        return asV;
      }
    }
docs: Unboxes {@code obj}. Assumes that obj is not {@code null} or a {@link SetFuture}.