2013-08-16 68 views
1

返回动态类型我如何写一个方法(如果有的话,我可以),将返回一个动态类型方法在Java

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中的结构,可以帮助我做到这一点

+2

你到底在做什么? –

+0

这篇文章应该有答案:http://stackoverflow.com/questions/450807/java-generics-how-do-i-make-the-method-return-type-generic?rq=1 – wanghq

+0

可能的重复问题:http://stackoverflow.com/questions/2669326/java-generic-return-type有更多的提示和建议那里... – jwest

回答

11

简单地说,申报方法一般,声明其返回类型,其等级:

public <T> T foo(Class<T> clazz, Object... args) { 
    return null; 
} 

显然参数不同的是什么人会需要。您可以实例化一个新的T有:

clazz.newInstance(); 

为null构造。

对于参数的构造函数(在本例中的String和对象O):

return x.getConstructor(String.class, Object.class).newInstance("s", new Object()); 

事实上,由于你的可变参数,你可以通过数组迭代,并得到构造函数查找所有必需的类对象。

然后,您可以放心地做:

String s = foo(String.class, "a", "b"); 

如果要约束吨至是HttpRequest使用一个子类:

public <T extends HttpRequest> T foo(Class<T> clazz, Object... args) 
1

你要找的仿制药:

public <T extends HttpRequest> T createRequest(Class<T> xclass, ...) 
0

Try:

public <X> createRequestObject(Class xclass , String url , String username , String password){ 

} 

public <? extends someSuperclass> createRequestObject(Class xclass , String url , String username , String password){ 


} 

限制返回类型的子类的一些超类定义的。

0

你可以做这样的事情

public <T> T createRequestObject(Class<T> cls, String arg) { 

    return TypeT; 
} 
2

考虑这样的情况下利用​​。

工厂实现将能够接受所需的请求类型,并为您提供所需的请求类型。

工厂方法模式是一种面向对象的创建设计模式,用于实现工厂的概念并处理创建对象(产品)的问题,而不指定将创建的确切类对象。

这听起来和你想要做的完全一样。

+1

+1好主意什么OP想要的。对于有限的设置,这是完美的。请注意,这不能用于任意类,但是。 – hexafraction

+1

由于海报是专门试图处理似乎是HTTP请求的,所以此解决方案应该适合他的需求。虽然它不像使用泛型一样灵活。 – Surveon

+1

当然,这样可以避免不必要的反射使用,创建一个类实例。 –