【问题标题】:Can I pass a subclass instance to a method which accepts superclass instance我可以将子类实例传递给接受超类实例的方法吗
【发布时间】:2015-04-27 23:52:59
【问题描述】:

我有一个类似的设置。当我尝试使用 java Reflections 调用 execRequest 方法并在 parameterArray 中传递子类实例 DelRequest 我收到 NoSuchMethodFound 异常

DelRequest delReq=new DelRequest();
delReq.setMsg("something");
Request req=(Request) delReq;

我有很少的服务方法,然后最终我调用了以下代码行。请注意,这次我传递 req 超类实例,因为它的定义是方法签名 public String execRequest(Request request)强>

lClass.getMethod( "execRequest", parameterArray)

这是我的基本设置,请指出我错在哪里,是否可以完成

class DelRequest extends Request {
private String msg;


 /* getters and setters */
}

class Request {
}



class ExecuteRequest{
public String execRequest(Request request){
/* request do something*/
}

}

【问题讨论】:

  • 是的,你可以。但我认为这不是你的问题。
  • execRequest 需要是静态的吗?静态函数和继承不是一个很好的组合!
  • 对不起,这不是静态的,我会编辑它

标签: java reflection polymorphism downcast upcasting


【解决方案1】:

反射 API 要求您使用参数的声明类型。因此,即使您可以使用DelRequest 调用execRequest,您也需要使用Request.class 作为getMethod 的参数。

parameterTypes 参数是一个 Class 对象数组 按声明的顺序标识方法的形式参数类型。如果 parameterTypes 为 null,将其视为空数组。

【讨论】:

  • 我正在尝试同样的事情,可能是我做错了什么。我尝试将 DelRequest**** 类型转换为 ***Request 并传递 Request 实例,但这似乎不起作用。任何帮助????
  • @Shahbaz 我不明白。请使用尝试的代码编辑您的问题。
  • 我已经编辑了这是虚拟代码而不是实际代码,但这是我实际上正在做的事情
  • @Shahbaz 在你的例子中parameterArray 是什么?它应该只是一个new Class<?>[] {Request.class}
  • 我现在得到了这个问题,实际上 lClass.getMethod("execRequest", parameterArray) 是在我们的框架中发生的,其中 parameterArray 数组由 DelRequest.class 组成。我添加了一个条件检查并使其成为 Request.class 并且它正在工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多