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>();
}
}
解释我正在尝试做的事情的最好方法可能是在代码中。
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>();
}
}