public class ConstructedOverrides { { new Sub().used(""); new Super().used(""); new Super().usedGeneric(1, ""); } public S indirectUse(S t) { return new Super().usedGeneric(null, t); } } class Super { public T used(T t) { return t; } public T unused(T t) { return t; } public U usedGeneric(U u, T t) { return u; } public U unusedGeneric(U u, T t) { return u; } } class Sub extends Super { @Override public String used(String s) { return s; } @Override public String unused(String s) { return s; } @Override public U usedGeneric(U u, String t) { return u; } } class Sub2 extends Sub { @Override public V usedGeneric(V u, String t) { return u; } @Override public V unusedGeneric(V u, String t) { return u; } }