簡體   English   中英

Factory方法,用於實例化泛型類中使用的對象的實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM