Шаблон фабрики 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);
}
}