У меня есть следующие классы.
public abstract class AbstractClass {
protected String value1;
public void setValue1(String value1) {
this.value1 = value1;
}
}
public abstract class ConcreteClass1 extends AbstractClass{
}
public abstract class ConcreteClass2 extends AbstractClass {
}
public class FactoryOfAbstractClass {
public AbstractClass newInstance(Class responseType) {
if (responseType == ConcreteClass1.class) {
return new ConcreteClass1();
} else if (responseType == ConcreteClass2.class) {
return new ConcreteClass2();
}
return null;
}
public abstract class ServiceClass<T extends AbstractClass> {
public T method1 (String arg1, String arg2, Class responseType) {
//Some operations resulting in a variable called value1
String value1= someOp();
T result = FactoryOfAbstractClass.newInstance(responseType);
result.setValue1(value1);
return result;
}
}
В строке T result = FactoryOfAbstractClass.newInstance(responseType);
я получаю ошибку компиляции, говорящую, что мне нужно типизировать объект, который я получаю к T. Iне понимаю ошибка компиляции , так как мой метод фабрики возвращает экземпляр класса Abstract и универсальный класс обслуживания T extends AbstractClass
.
Проблема компиляции исчезает, как только я приведу ее к TНо я не понимаю, почему мы должны в первую очередь настраивать его.Зачем нужна приведение типов?
Другой вариант - не использовать фабрику и вместо этого идти с responseType.newInstance()
.Но это внутренне использует отражения, и я хочу их избежать.Есть ли другой подход, который я могу использовать для этого?