class InvalidGenericSubclass { public static void main(String[] args) { BaseInput input = new BaseInput<BaseInput, BaseInput.BaseOutput>() { }; BaseInput input2 = InvalidGenericSubclass.create(); new InvalidGenericSubclass(); } interface Input, OutputType extends Input.Output> { interface Output, InputType extends Output> { } } interface BaseInput, BaseOutputType extends BaseInput.BaseOutput> extends Input { interface BaseOutput, BaseOutputType extends BaseOutput> extends Output { } } static , BaseOutputType extends BaseInput.BaseOutput> BaseInput create() { return null; } , BaseOutputType extends BaseInput.BaseOutput> InvalidGenericSubclass() {} }