[英]Factory method to instantiate instance of objects used in a generic 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 result = FactoryOfAbstractClass.newInstance(responseType);
我得到一個編譯錯誤,說我需要對我得到的對象進行類型轉換。我不理解編譯錯誤,因為我的工廠方法返回了一個Abstract類的實例,而服務類的泛型T extends AbstractClass
。
一旦我把它編譯成T,編譯問題就消失了。但是我不明白為什么我們首先需要對它進行類型化。 為什么需要進行類型轉換?
另一個選擇是不使用Factory而是使用responseType.newInstance()
。 但內部使用反射,我想避免它們。 我可以采取其他方法嗎?
我不理解編譯錯誤,因為我的工廠方法返回一個Abstract類的實例,而服務類的泛型T擴展了AbstractClass
讓我們用Car
取代AbstractClass
,以獲得更易理解的解釋。 假設一個程序員創建一個ServiceClass<Mercedes>
(Mercedes是一個類型的汽車,對吧?)。 FactoryOfAbstractClass.newInstance()
的返回類型是Car
。 因此編譯器不知道此方法返回的具體Car類型。 它可能是梅賽德斯,但也可能是福特,標致或Volskwagen。 但是您將結果分配給T
(在本例中為Mercedes
)。 所以沒有強制轉換就無法編譯。
坦白說,這家工廠完全沒必要。 由於調用者應該通過該類來使用,因此您可以只使用該類的實例而不是工廠,從而讓調用者創建實例。 或者您可以將Supplier<AbstractClass>
作為參數,並且調用者只需要傳遞ConcreteClass1::new
。 這將使代碼更簡單,更安全,更具可擴展性(因為您不僅限於兩個已知的子類)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.