import org.jetbrains.annotations.NotNull; class A<T, U> { @NotNull T foo() { return null; } } class B<T> extends A<T, Integer> { @Override @NotNull T foo() { return null; } } class C extends B<String> { @Override @NotNull String foo() { return null; } }