code: @Nullable
    public <T> Cache<String, T> createCache(final ConcurrentLinkedDeque<T> out, Ticker ticker) {
      Preconditions.checkNotNull(out, "The out deque cannot be null");
      Preconditions.checkNotNull(ticker, "The ticker cannot be null");
      if (numEntries <= 0) {
        return null;
      }
      final RemovalListener<String, T> listener = new RemovalListener<String, T>() {
        @Override
        public void onRemoval(RemovalNotification<String, T> notification) {
          out.addFirst(notification.getValue());
        }
      };
      CacheBuilder<String, T> b = CacheBuilder.newBuilder().maximumSize(numEntries).ticker(ticker)
          .removalListener(listener);
      if (expirationMillis >= 0) {
        b.expireAfterWrite(expirationMillis, TimeUnit.MILLISECONDS);
      }
      return b.build();
    }
docs: Creates a {@link Cache} configured by this instance.
  
  @param <T>
  the type of the value stored in the Cache
  @param out
  a concurrent {@code Deque} to which the cached values are
  added as they are removed from the cache
  @param ticker
  the time source used to determine expiration
  @return a {@link Cache} corresponding to this instance's values or
  {@code null} unless {@code #numEntries} is positive.