Java 通用工厂实现

Java generic factory implementation

解释我正在尝试做的事情的最好方法可能是在代码中。

Public class Product
Public class Vendor<T extends Product>

现在我正在尝试创建一个通用工厂,它将根据字符串输入参数为您提供供应商

   Public Factory {
      public Vendor getInstance(String Type){
          Class cls = Class.forName(Type);
          return new Vendor<cls>();
      }
   }

我怎样才能创建这个通用工厂?

好吧,如果您绝对想根据收到的参数创建供应商,则应该使用 Class 而不是字符串。也可以参数化您的方法以确保您收到 T extends Product 类型。

public class Main {

    static class Product {}
    static class SubProd extends Product {}
    static class Vendor<T extends Product> {}

    public static <T extends Product> Vendor<T> getInstance(Class<T> clazz) {
        return new Vendor<T>();
    }

    public static void main(String[] args) {
        Vendor<SubProd> v = Main.getInstance(Main.SubProd.class);
        System.out.println(v);
    }
}

如您所见,class 参数并未直接使用,而是用于强制返回供应商的类型。此代码在没有警告、异常或转换的情况下编译和运行。使用 String 时,您必须处理所有可能发生的异常,并且可能会在各处进行难看的转换。

泛型非常强大,我相信这个小例子展示了泛型的一些用途。但是,请注意,有时有更简单优雅的方法来解决问题。

你不能那样做,因为编译器在编译过程中在内部使用泛型类型信息。

您可能希望向您的工厂发送通用 class 类型:

   public class Factory {
      public <PRODUCT extends Product> Vendor<PRODUCT> getInstance(Class<PRODUCT> productClazz){
          return new Vendor<PRODUCT>();
      }
   }