code: @Override
      public V get(Object key) {
          if (key == null) {
              throw new NullPointerException();
          }
          
          CachedValue<K, V> entry = map.get(key);
          if (entry == null) {
              return null;
          }
          if (isValueExpired(entry)) {
              if (map.remove(key, entry)) {
                  onValueRemove(entry);
                  return null;
              }
              return get(key);
          }
          return readValue(entry);
      }
docs: /*
  (non-Javadoc)
  @see java.util.Map#get(java.lang.Object)