class StringPropagationAdapter implements Propagation<K> {

  public static <K> Propagation<K> create(Propagation<String> delegate, KeyFactory<K> keyFactory) {
    if (delegate == null) throw new NullPointerException("delegate == null");
    if (keyFactory == null) throw new NullPointerException("keyFactory == null");
    if (keyFactory == KeyFactory.STRING) return (Propagation<K>) delegate;
    return new StringPropagationAdapter<>(delegate, keyFactory);
  }

    StringPropagationAdapter(Propagation<String> delegate, KeyFactory<K> keyFactory);

}