class Test { static class TKey<T> {} public interface Getter { <T> T getValue(TKey<T> key); } public static <TK extends TKey<?>> TK getAKey(TK tKeySuffix) { return tKeySuffix; } static final TKey<Double> KEY_D = new TKey<>(); public static void f(Getter getter) { double d1 = getter.getValue(KEY_D); double d2 = getter.getValue(getAKey(KEY_D)); TKey<Double> aKey = getAKey(KEY_D); double d3 = getter.getValue(aKey); } }