Я бы хотел, чтобы мой BallUserInterfaceFactory возвращал экземпляр пользовательского интерфейса, который имеет собственный общий тип. Я застрял в примере ниже, получив ошибку:
Связанное несоответствие: общий метод getBaseballUserInterface (BASEBALL) типа BallUserInterfaceFactory не применим для аргументов (МЯЧ). Выведенный тип BALL не является допустимой заменой ограниченный параметр
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, я получаю ошибку:
Несоответствие типов: невозможно преобразовать из
BaseballUserInterface<Baseball>доBallUserInterface<BALL>
Потому что он не может гарантировать, что то, что я возвращаю, является одним и тем же типом шара.
Мой вопрос: какова стратегия решения этой ситуации?
(Для полноты здесь приведены другие классы, необходимые в примере)
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);
    }
}
