关于泛型:在java中返回动态类型的方法

method returning dynamic type in java

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

类似的东西

1
2
3
4
5
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
}

然后我可以像

1
2
3
4
5
HttpGet httpGet = createRequestObject(HttpGet.class ,"http://wwww.google.com ,"username","password");

or

HttpPost httpPost = createRequestObject(HttpPost.class ,"
http://wwww.google.com ,"username","password");

我知道我可以返回一个对象,然后再把它扔掉,但是我不喜欢铸件,所以想知道Java中是否有一个结构可以帮助我完成这个任务。


简单地,将方法声明为泛型,声明其返回类型及其类:

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

很明显,参数和我们需要的是不同的。您可以用以下方法实例化新的T

1
clazz.newInstance();

对于空构造函数。

对于带参数的构造函数(在本例中是字符串S和对象O):

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

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

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

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

如果要将t约束为HttpRequest的子类,请使用:

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

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

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

The factory method pattern is an object-oriented creational design pattern to implement the concept of factories and deals with the problem of creating objects (products) without specifying the exact class of object that will be created.

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


你在找仿制药:

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

你可以这样做

1
2
3
4
public <T> T createRequestObject(Class<T> cls, String arg) {

    return TypeT;
}

尝试:

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

}

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


}

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