Шаблон фабрики Java с использованием обобщений

Я хотел бы мойBallUserInterfaceFactory вернуть экземпляр пользовательского интерфейса, который имеет правильный универсальный тип. Я застрял в приведенном ниже примере получения ошибки:

Bound mismatch: The generic method getBaseballUserInterface(BASEBALL) of type BallUserInterfaceFactory is not applicable for the arguments (BALL). The inferred type BALL is not a valid substitute for the bounded parameter

public class BallUserInterfaceFactory {
    public static <BALL extends Ball> BallUserInterface<BALL> getUserInterface(BALL ball) {

        if(ball instanceof Baseball){
            return getBaseballUserInterface(ball);
        }
        //Other ball types go here

        //Unable to create a UI for ball
        return null;
    }

    private static <BASEBALL extends Baseball> BaseballUserInterface<BASEBALL> getBaseballUserInterface(BASEBALL ball){
        return new BaseballUserInterface<BASEBALL>(ball);
    }
}

Я понимаю, что это не может гарантировать, что BALL является бейсбольным мячом, и поэтому при вызове метода getBaseballUserInterface существует несоответствие типов параметров.

Если я приведу параметр ball в вызове метода getBaseballUserInterface, то получу ошибку:

Type mismatch: cannot convert from BaseballUserInterface<Baseball> to BallUserInterface<BALL>

Потому что это не может гарантировать, что я возвращаю один и тот же тип шара.

My question is, what is the strategy for dealing with this situation?

(Для полноты вот другие классы, требуемые в примере)

public class Ball {

}

public class Baseball extends Ball {

}

public class BallUserInterface <BALL extends Ball> {

    private BALL ball;

    public BallUserInterface(BALL ball){
        this.ball = ball;
    }
}

public class BaseballUserInterface<BASEBALL extends Baseball> extends BallUserInterface<BASEBALL>{

    public BaseballUserInterface(BASEBALL ball) {
        super(ball);
    }

}

Ответы на вопрос(3)

Ваш ответ на вопрос