c# - 在泛型方法中创建返回类型的实例

标签 c# java generics

我希望在 java 中创建一个通用的辅助方法,它模仿以下 C# 方法的功能。

private T Execute<T>(Request request) where T : Response, new()
{
     .... Code
}

在以下情况下会调用上面的方法

    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);
    }

上述每种情况都在各自的情况下扩展了一个类 Response 或 Request。

我曾尝试使用 Java 泛型创建与上述 ​​C# 代码相同的实现,但我没有取得任何成功。是否可以只使用一种辅助方法来实现相同的功能,或者我是否被迫为每种类型的调用创建一个单独的辅助方法。

编辑:

这是我当前的 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]);
    }
}

我目前的麻烦源于函数无法将返回识别为有效对象。无法将对象 T 初始化为 Response,并且 T 对象无法识别 Response 中实现的方法。

最佳答案

在 Java 中,无法创建 T 的实例不发送类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();
    }
}

请注意,因为这只是一个示例,所以我更喜欢抛出异常而不处理它们。对于真实世界的应用程序,您应该处理异常而不是仅仅抛出它们。

关于c# - 在泛型方法中创建返回类型的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16859973/

相关文章:

c# - 如何在 C# 中通过基于 TCP 协议(protocol)的套接字发送文件?

c# - string.IsNullOrEmpty() 与 string.NotNullOrEmpty()

salesforce API jar 的 Maven 阴影 jar 中的 java.lang.NoClassDefFoundError

java - 方法提取、泛型、反射

java - 使用 Java 泛型进行类型强制

java - 如何使用数组列表的不同子类型重载构造函数?

c# - 在 C# 中对 TreeViewItems 列表进行数字排序

C# Linq to Sql XML 检索父级中最近的元素

java - 编译(通用性)问题覆盖 Properties.putAll

java - 如何理解 javap 输出中的 LocalVariableTable 区域