如何编写一个返回动态类型
的方法(如果可以的话)类似
public X createRequestObject(Class xclass , String url , String username , String password){
X x = Class.forName(xclass.getCannonicalName()).getConstructor(String.class).newInstance(url);
x.setheader("AUTHORIZATION" , createHeader(username,password)
return x
}
然后我可以像
一样使用它HttpGet httpGet = createRequestObject(HttpGet.class , "http://wwww.google.com , "username","password");
or
HttpPost httpPost = createRequestObject(HttpPost.class , "http://wwww.google.com , "username","password");
我知道我可以返回一个对象,然后再投出它,但我不喜欢强制转换,所以想知道java中是否有一个可以帮助我做这个的构造
答案 0 :(得分:11)
简单地说,将方法声明为泛型,声明其返回类型及其类:
public <T> T foo(Class<T> clazz, Object... args) {
return null;
}
显然,参数与人们需要的参数不同。您可以使用:
实例化新的T
clazz.newInstance();
是一个无效的构造函数。
对于带参数的构造函数(在本例中为String s和Object o):
return x.getConstructor(String.class, Object.class).newInstance("s", new Object());
实际上,多亏了你的varargs,你可以遍历数组并获得构造函数查找所需的所有类对象。
然后你可以安全地做到:
String s = foo(String.class, "a", "b");
如果您想将T约束为HttpRequest
的子类,请使用:
public <T extends HttpRequest> T foo(Class<T> clazz, Object... args)
答案 1 :(得分:2)
考虑在这种情况下使用factory pattern。
工厂实现可以接受您想要的请求类型,并为您提供所需的请求类型。
工厂方法模式是一种面向对象的创建设计模式,用于实现工厂的概念,并处理创建对象(产品)的问题,而不指定将要创建的对象的确切类。
这听起来和你想做的完全一样。
答案 2 :(得分:1)
您正在寻找泛型:
public <T extends HttpRequest> T createRequest(Class<T> xclass, ...)
答案 3 :(得分:0)
尝试:
public <X> createRequestObject(Class xclass , String url , String username , String password){
}
或
public <? extends someSuperclass> createRequestObject(Class xclass , String url , String username , String password){
}
将返回类型限制为您定义的某些superClass的子类。
答案 4 :(得分:0)
你可以做这样的事情
public <T> T createRequestObject(Class<T> cls, String arg) {
return TypeT;
}