public final @NotNull List<T> forKey(@NotNull KeyT key) {
    String stringKey = keyToString(key);

    List<T> cached = cache.get(stringKey);
    if (cached != null) {
      return cached;
    }

    cached = buildExtensions(stringKey, key);

    synchronized (lock) {
      List<T> recent = cache.get(stringKey);
      if (recent != null) {
        return recent;
      }

      cache = with(cache, stringKey, cached);
      return cached;
    }
  }
public final @NotNull List<T> forKey(@NotNull KeyT key)