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

我希望在java中创建一个通用的helper方法,模仿下面C#方法的功能

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
}