import java.util.HashMap; import java.util.List; import java.util.Map; public abstract class A<T extends A< T, S>, S extends List< ?>> { T t; S s; A< T, S> a; Object field = a.<T, S>getMap(t, s); public A() { <T, S>this(null, null); } public <M, N> A(M param1, N param2) { } public <M, N> Map< M, N> getMap(M key, N value) { return null; } } class B extends A< B, List< String>> { public <M, N> B(M param1, N param2) { <M, N>super(param1, param2); } public <M, N> Map< M, N> getMap(M key, N value) { B b = new <M, N>B(key, value); AMethod method = b::<String, String>getMap; AMethod method2 = super::<String, String>getMap; AMethod method3 = AMap< M>::<String, String>new; AMethod method4 = AMap< M>::<String, String>createAMap; return super.<M, N>getMap(key, value); } } interface AMethod { Map< String, String> getMap(String key, String value); } class AMap<T> extends HashMap< String, String> { public <M, N> AMap(String param1, String param2) { } public static <M, N> AMap< M> createAMap(String param1, String param2) { return new AMap<>(param1, param2); } }