C# 在泛型方法中创建返回类型的实例
我希望在java中创建一个通用的helper方法,模仿下面C#方法的功能C# 在泛型方法中创建返回类型的实例,c#,java,generics,C#,Java,Generics,我希望在java中创建一个通用的helper方法,模仿下面C#方法的功能 private T Execute(请求),其中T:Response,new() { ……代码 } 在以下情况下调用上述方法 public AddLogicalDeviceResponse AddLogicalDevice(AddLogicalDeviceRequest request) { return Execute<AddLogicalDeviceResponse>(re
private T Execute(请求),其中T:Response,new()
{
……代码
}
在以下情况下调用上述方法
public AddLogicalDeviceResponse AddLogicalDevice(AddLogicalDeviceRequest request)
{
return Execute<AddLogicalDeviceResponse>(request);
}
public GetConfigurationResponse GetConfiguration(GetConfigurationRequest request)
{
return Execute<GetConfigurationResponse>(request);
}
public GetDeviceDefinitionsResponse GetDeviceDefinitions(GetDeviceDefinitionsRequest request)
{
return Execute<GetDeviceDefinitionsResponse>(request);
}
public RemoveLogicalDeviceResponse RemoveLogicalDevice(RemoveLogicalDeviceRequest request)
{
return Execute<RemoveLogicalDeviceResponse>(request);
}
public GetEPCListCommandResponse GetEPCListCommand(GetEPCListCommandRequest request)
{
return Execute<GetEPCListCommandResponse>(request);
}
public DeviceSpecificCommandResponse DeviceSpecificCommand(DeviceSpecificCommandRequest request)
{
return Execute<DeviceSpecificCommandResponse>(request);
}
public GetConfigValuesCommandResponse GetConfigValuesCommand(GetConfigValuesCommandRequest request)
{
return Execute<GetConfigValuesCommandResponse>(request);
}
public SetConfigValuesCommandResponse SetConfigValuesCommand(SetConfigValuesCommandRequest request)
{
return Execute<SetConfigValuesCommandResponse>(request);
}
public UpdateFirmwareCommandResponse UpdateFirmwareCommand(UpdateFirmwareCommandRequest request)
{
return Execute<UpdateFirmwareCommandResponse>(request);
}
public AddLogicalDeviceResponse AddLogicalDevice(AddLogicalDeviceRequest请求)
{
返回执行(请求);
}
公共GetConfigurationResponse GetConfiguration(GetConfigurationRequest请求)
{
返回执行(请求);
}
公共GetDeviceDefinitionResponse GetDeviceDefinitions(GetDeviceDefinitionRequest请求)
{
返回执行(请求);
}
公共RemoveLogicalDeviceResponse RemoveLogicalDevice(RemoveLogicalDeviceRequest请求)
{
返回执行(请求);
}
公共GetEPCListCommandResponse GetEPCListCommand(GetEPCListCommandRequest请求)
{
返回执行(请求);
}
公用设备SpecificCommand响应设备SpecificCommand(设备SpecificCommand请求)
{
返回执行(请求);
}
公共GetConfigValuesCommand响应GetConfigValuesCommand(GetConfigValuesCommand请求)
{
返回执行(请求);
}
公共设置配置值命令响应设置配置值命令(设置配置值命令请求)
{
返回执行(请求);
}
公共UpdateFirmwareCommandResponse UpdateFirmwareCommand(UpdateFirmwareCommandRequest请求)
{
返回执行(请求);
}
上述每种情况都在各自的情况下扩展了类响应或请求
我曾尝试使用Java泛型创建与上述C#代码相同的实现,但没有任何成功。是否可以只使用一个helper方法来实现相同的功能,或者强制我为每个单独的调用类型创建一个单独的helper方法
编辑:
下面是我当前的Java实现
private <T extends Response> execute(Request request)
{
String url = request.BuildUri(_baseUri, _accessKey);
Object[] response = Send(url, "");
if(((Integer)response[1] == 200))
{
T jsResponse = new T();
jsResponse.Body = (String)response[0];
jsResponse.Request = url;
return jsResponse;
}
else
{
throw new ResponseException(response[1], response[2], url, response[0]);
}
}
private执行(请求)
{
字符串url=request.BuildUri(\u baseUri,\u accessKey);
对象[]响应=发送(url,“”);
if(((整数)响应[1]==200))
{
T jsResponse=newt();
jsResponse.Body=(字符串)响应[0];
jsResponse.Request=url;
返回jsResponse;
}
其他的
{
抛出新的ResponseException(响应[1],响应[2],url,响应[0]);
}
}
我当前的问题源于函数无法将返回识别为有效对象。无法将对象T初始化为响应,并且T对象无法识别响应中实现的方法 在Java中,如果不将
class
作为参数发送,就无法创建T
类的实例。以下是将此选项用于当前选项的示例:
interface Request {}
interface Response {
public String sayHi();
}
class DeviceRequest implements Request {}
class DeviceResponse implements Response{
public String sayHi() { return "DeviceResponse"; }
}
class WebRequest implements Request {}
class WebResponse implements Response{
public String sayHi() { return "WebResponse"; }
}
class Helper {
private <T extends Response> T execute(Request request, Class<T> clazz) throws InstantiationException, IllegalAccessException {
return clazz.newInstance();
}
public DeviceResponse foo(DeviceRequest request) throws InstantiationException, IllegalAccessException {
return execute(request, DeviceResponse.class);
}
public WebResponse bar(WebRequest request) throws InstantiationException, IllegalAccessException {
return execute(request, WebResponse.class);
}
}
class Consumer {
public void baz() throws InstantiationException, IllegalAccessException {
Helper helper = new Helper();
DeviceResponse dr = helper.foo(new DeviceRequest());
WebResponse wr = helper.bar(new WebRequest());
System.out.println(dr.sayHi());
System.out.println(wr.sayHi());
}
public static void main(String[] args) throws Exception {
new Consumer().baz();
}
}
接口请求{}
界面响应{
公共字符串sayHi();
}
类DeviceRequest实现请求{}
类DeviceResponse实现响应{
公共字符串sayHi(){返回“DeviceResponse”;}
}
类WebRequest实现请求{}
类WebResponse实现响应{
公共字符串sayHi(){返回“WebResponse”;}
}
类助手{
private T execute(请求,类clazz)抛出实例化异常,IllegalAccessException{
返回clazz.newInstance();
}
公共设备响应foo(DeviceRequest请求)抛出实例化异常、非法访问异常{
返回execute(请求,DeviceResponse.class);
}
公共WebResponse栏(WebRequest请求)抛出实例化异常、非法访问异常{
返回execute(请求,WebResponse.class);
}
}
阶级消费者{
public void baz()抛出实例化异常,IllegalAccessException{
Helper=newhelper();
DeviceResponse dr=helper.foo(新的DeviceRequest());
WebResponse wr=helper.bar(新的WebRequest());
System.out.println(dr.sayHi());
System.out.println(wr.sayHi());
}
公共静态void main(字符串[]args)引发异常{
新消费者().baz();
}
}
请注意,由于这只是一个示例,我更喜欢只抛出异常而不处理它们。对于真实世界的应用程序,您应该处理异常,而不是仅仅抛出异常。在Java中,如果不将
class
作为参数发送,则无法创建T
类的实例。以下是将此选项用于当前选项的示例:
interface Request {}
interface Response {
public String sayHi();
}
class DeviceRequest implements Request {}
class DeviceResponse implements Response{
public String sayHi() { return "DeviceResponse"; }
}
class WebRequest implements Request {}
class WebResponse implements Response{
public String sayHi() { return "WebResponse"; }
}
class Helper {
private <T extends Response> T execute(Request request, Class<T> clazz) throws InstantiationException, IllegalAccessException {
return clazz.newInstance();
}
public DeviceResponse foo(DeviceRequest request) throws InstantiationException, IllegalAccessException {
return execute(request, DeviceResponse.class);
}
public WebResponse bar(WebRequest request) throws InstantiationException, IllegalAccessException {
return execute(request, WebResponse.class);
}
}
class Consumer {
public void baz() throws InstantiationException, IllegalAccessException {
Helper helper = new Helper();
DeviceResponse dr = helper.foo(new DeviceRequest());
WebResponse wr = helper.bar(new WebRequest());
System.out.println(dr.sayHi());
System.out.println(wr.sayHi());
}
public static void main(String[] args) throws Exception {
new Consumer().baz();
}
}
接口请求{}
界面响应{
公共字符串sayHi();
}
类DeviceRequest实现请求{}
类DeviceResponse实现响应{
公共字符串sayHi(){返回“DeviceResponse”;}
}
类WebRequest实现请求{}
类WebResponse实现响应{
公共字符串sayHi(){返回“WebResponse”;}
}
类助手{
private T execute(请求,类clazz)抛出实例化异常,IllegalAccessException{
返回clazz.newInstance();
}
公共设备响应foo(DeviceRequest请求)抛出实例化异常、非法访问异常{
返回execute(请求,DeviceResponse.class);
}
公共WebResponse栏(WebRequest请求)抛出实例化异常、非法访问异常{
返回execute(请求,WebResponse.class);
}
}
阶级消费者{
public void baz()抛出实例化异常,IllegalAccessException{
Helper=newhelper();
DeviceResponse dr=helper.foo(新的DeviceRequest());
WebResponse wr=helper.bar(新的WebRequest());
System.out.println(dr.sayHi());
System.out.println(wr.sayHi());
}
公共静态void main(字符串[]args)引发异常{
新消费者().baz();
}
}
请注意,因为这只是一个示例,所以我更喜欢直接抛出异常
private <T extends Response> T execute(Request request)
{
.... Code
}