【发布时间】:2018-09-15 08:17:24
【问题描述】:
我有以下课程。
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。我不理解 编译错误,因为我的工厂方法正在返回一个实例抽象类和服务类的泛型T extends AbstractClass。
一旦我将它转换为 T,编译问题就消失了。但我不明白为什么我们首先需要对它进行类型转换。为什么需要类型转换?
另一种选择是不使用工厂,而是使用responseType.newInstance()。但这在内部使用了反射,我想避免它们。
我还有其他方法可以解决这个问题吗?
【问题讨论】:
-
不要使用原始类型:
Class应该是Class<? extends AbstractClass>。
标签: java generics factory generic-programming