gpt4 book ai didi

java - 实例化泛型类中使用的对象实例的工厂方法

转载 作者:行者123 更新时间:2023-11-29 04:16:05 26 4
gpt4 key购买 nike

我有以下类(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

让我们替换AbstractClassCar以获得更容易理解的解释。假设一个程序员创建了一个 ServiceClass<Mercedes> (梅赛德斯是汽车的一种,对吧?)。 FactoryOfAbstractClass.newInstance()的返回类型是 Car .所以编译器不知道这个方法返回的 Car 的具体类型。它可以是梅赛德斯,但也可以是福特、标致或大众汽车。但是您将结果分配给 T (在本例中为 Mercedes )。所以如果没有强制转换就无法编译。

坦白说,这个工厂完全没有必要。由于调用者无论如何都应该传递要使用的类,因此您可以只获取该类的实例而不是工厂,从而让调用者创建实例。或者你可以拿 Supplier<AbstractClass>作为参数,调用者只需要传递 ConcreteClass1::new .这将使代码更简单、更安全且更可扩展(因为您不会仅限于两个已知的子类)。

关于java - 实例化泛型类中使用的对象实例的工厂方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52342953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com