Я структуру, как это:использование дженериков в качестве возвращаемого типа
abstract class MyDomain{...}
abstract class FooDomain extends MyDomain{...}
abstract class BarDomain extends MyDomain{...}
class FirstConcreteBarDomain extends BarDomain{...}
class SecondConcreteBarDomain extends BarDomain{...}
мне нужен завод, который создает MyDomain
объекты. Моя первая попытка была такова:
public interface ISpecializedObjectsFactory {
public <T extends MyDomain> T create(Class<?> clazz);
}
Implementend как:
public class FirstSpecializedObjectsFactory implements ISpecializedObjectsFactory {
@Override
public <T extends MyDomain> T create(Class<?> clazz) {
if(clazz.equals(BarDomain.class))
return new FirstBarDomain();
throw new InvalidParameterException();
}
Same для SecondBarDomain
.
ПЕРВЫЙ ВОПРОС: Почему это генерируется ошибка, которая говорит, что она не может бросить FirstBarDomain
в T
?
После этой ошибки я представил актерский состав: return (T) new FirstBarDomain();
.
Проблема заключается в том, что приведение небезопасно, и я хочу быть уверенным в результате, поэтому я ввел еще одно ограничение (при условии, что каждый объект имеет MyDomain
всегда 2 уровней вывода):
public <T extends AnagrafeDomain, S extends T> S create(Class<T> clazz)
ВТОРОЙ ВОПРОС: Предполагая, что этот завод является единственной точкой входа, где создаются объекты MyDomain
, и что вызовы на фабрику никогда не используют конкретные классы (но всегда такие: BarDomain subj = SpecializedObjectsFactory.getFactory().create(BarDomain.class);
), вопрос в том, является ли эта новая версия безопасной ?
OP сказал:«звонки на заводе никогда не использовать конкретные классы» –
@ sharonbn Правильно, но это все еще не делает его безопасным; даже если '' 'MyFakeDomain''' '' abstract''', это все равно приведет к той же проблеме. Я явно сделаю его абстрактным, чтобы избежать путаницы. – Toby
Это должно и должно быть вызвано исключением класса. Разумеется, вы бы использовали интерфейс BarDomain для развязки кода из spesific-реализации. Точно так же, как вы предпочитаете 'List