解释我要做的事情的最好方法可能是代码。
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>();
}
}
我如何能够创建这个通用工厂?
答案 0 :(得分:1)
好吧,如果您绝对想要根据收到的参数创建供应商,则应使用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时,您必须处理可能发生的所有异常,并且可能会在这里和那里进行丑恶的转换。
泛型非常强大,我相信这些小例子展示了他们可以做些什么。但是,请注意,有时候,有更简单,更优雅的方法来解决问题。
答案 1 :(得分:0)
您不能这样做,因为编译器在编译过程中会在内部使用泛型类型信息。
您可能希望将通用类类型发送到工厂:
rcleartool