@SuppressWarnings("unchecked")
  public U get(String key){
    synchronized(this.cache){
      U obj;
      SoftReference<U> ref;
      if((ref = this.cache.get(key)) != null){
        if((obj = ref.get()) != null){
          return obj;
        }
      }else{
        if(!this.bloom.isPresent(key)){ //if the key is in the cache but it just has expired then we do not ALSO need to check the bloom filter
          return null;
        }
      }
      obj = (U)this.backing.get(key, this.group);
      if(obj != null){
        this.cache.put(key, new SoftReference<U>(obj));
      }
      return obj;
    }
  }