方法在java中返回动态类型

时间:2013-08-16 14:56:46

标签: java generics

如何编写一个返回动态类型

的方法(如果可以的话)

类似

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

5 个答案:

答案 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;
}