3

如何编写返回动态类型的方法(如果可以的话)

就像是

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 中是否有一个构造可以帮助我做到这一点

4

5 回答 5

13

简单地说,将方法声明为泛型,声明它的返回类型和它的类:

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());

事实上,多亏了您的可变参数,您可以遍历数组并获取构造函数查找所需的所有类对象。

然后,您可以安全地执行以下操作:

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

如果您想将 T 限制为HttpRequestuse 的子类:

public <T extends HttpRequest> T foo(Class<T> clazz, Object... args)
于 2013-08-16T15:00:50.373 回答
2

考虑在这种情况下使用工厂模式。

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

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

这听起来与您正在尝试做的完全一样。

于 2013-08-16T15:06:49.270 回答
1

您正在寻找泛型:

public <T extends HttpRequest> T createRequest(Class<T> xclass, ...)
于 2013-08-16T15:01:07.143 回答
0

尝试:

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

}

或者

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


}

将返回类型限制为您定义的某个超类的子类。

于 2013-08-16T15:02:02.227 回答
0

你可以做这样的事情

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

    return TypeT;
}
于 2013-08-16T15:03:08.947 回答