- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下类(class)。
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()
。但这在内部使用了反射,我想避免它们。我可以采取任何其他方法吗?
最佳答案
I don't understand the compilation error since my factory method is returning an instance of Abstract class and the service class's generic T extends AbstractClass
让我们替换AbstractClass
与 Car
以获得更容易理解的解释。假设一个程序员创建了一个 ServiceClass<Mercedes>
(梅赛德斯是汽车的一种,对吧?)。 FactoryOfAbstractClass.newInstance()
的返回类型是 Car
.所以编译器不知道这个方法返回的 Car 的具体类型。它可以是梅赛德斯,但也可以是福特、标致或大众汽车。但是您将结果分配给 T
(在本例中为 Mercedes
)。所以如果没有强制转换就无法编译。
坦白说,这个工厂完全没有必要。由于调用者无论如何都应该传递要使用的类,因此您可以只获取该类的实例而不是工厂,从而让调用者创建实例。或者你可以拿 Supplier<AbstractClass>
作为参数,调用者只需要传递 ConcreteClass1::new
.这将使代码更简单、更安全且更可扩展(因为您不会仅限于两个已知的子类)。
关于java - 实例化泛型类中使用的对象实例的工厂方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52342953/
我是一名优秀的程序员,十分优秀!