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); } }