Я бы хотел, чтобы мой 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);
}
}