【问题标题】:method returning dynamic type in javajava中返回动态类型的方法
【发布时间】:2013-08-19 00:51:01
【问题描述】:

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

类似

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

【问题讨论】:

标签: java generics


【解决方案1】:

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

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 限制为 HttpRequest 的子类,请使用:

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

【讨论】:

    【解决方案2】:

    您正在寻找泛型:

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

    【讨论】:

      【解决方案3】:

      试试:

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

      或

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

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

      【讨论】:

        【解决方案4】:

        你可以这样做

        public <T> T createRequestObject(Class<T> cls, String arg) {
        
            return TypeT;
        }
        

        【讨论】:

          【解决方案5】:

          考虑在这种情况下使用factory pattern。

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

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

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

          【讨论】:

          • +1 OP 想要什么的好主意。对于限量版来说,这是完美的。但是请注意,这不适用于任意类。
          • 由于发帖人专门尝试处理看似 HTTP 请求的内容,因此该解决方案应该适合他的需求。不过,它不像使用泛型那样灵活。
          • 当然,这避免了不必要地使用反射来创建类实例。
          • @Surveon 是的,完全正确。这对问题也有好处,应该认真考虑。顺便说一句,欢迎使用 Stack Overflow!
          • @hexafraction 干杯!在更一般的情况下,我喜欢您的解决方案。在某些时候,这种实现肯定会派上用场。
          猜你喜欢
          • 1970-01-01
          • 2012-01-01
          • 1970-01-01
          • 2018-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-04
          • 2014-05-27
          相关资源
          最近更新 更多