code: public <T extends AbstractPutObjectRequest> T withKey(String key) {
          setKey(key);
          @SuppressWarnings("unchecked") T t = (T)this;
          return t;
      }
docs: Sets the key under which to store the new object. Returns this object,
  enabling additional method calls to be chained together.
  
  @param key
  The key under which to store the new object.
  
  @return This {@link AbstractPutObjectRequest}, enabling additional method calls to be
  chained together.
  
  @see AbstractPutObjectRequest#getKey()
  @see AbstractPutObjectRequest#setKey(String)