指定包含编译时间注释的有界类型参数



如果使用generics?

,可以检查一类在编译时间中包含特定注释吗?

我正在创建一个包装类别,这将是对各种HTTP调用的响应。

我想要的是该包装类别,以使用户可以通过我自己注释注释的任何类型的对象传递。

例如,我的包装类可以如下:

public class HTTPResponse<T> {
    private HttpStatus status;
    private int statusCode;
    private T data;
    public HTTPResponse(HttpStatus status, T data) {
        this.status = status;
        this.statusCode = status.value();
        this.data = data;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
    //other getters/setters
}

使用此类时,我可以创建一个新的httpresponse对象并声明"数据"字段的类型:

HTTPResponse<SomePOJO> response = new HTTPResponse<>(HttpStatus.OK, new SomePOJO()); 

这个想法是,任何试图使用此课程的人都可以在施工期间通过自己的自定义Pojo传递。但是,我希望能够检查在构造过程中通过我创建的自定义接口注释的对象。

例如,我的SomePojo类需要看起来像下面:

@MyCustomInterface
public class SomePOJO() {
    //code stuff here
}

有没有办法检查在编译时间内用@MyCustomInterface注释SomePoJo类的方法吗?

我知道我可以标记我的注释,以便在运行时可用,然后在httpresponse类的构造函数中执行检查。但是,我真的很想让我的班级用户尽快知道(在编译时间内)他们尚未用正确的接口标记自己的pojo,因此在创建httpresponse对象之前需要做到这一点。

在这种情况下,注释甚至是正确的方法吗?是否无法以某种方式检查在编译时间期间100%检查类注释,我应该强迫用户实现我的自定义界面,然后指定

HTTPResponse with public class HttpResponse<T implements MyCustomInterface> {
    //fields, getters, setters
}

感谢您的阅读,如果您设法使它变得如此远!

上面的自定义注释的目的只是将类标记为可以在httpresponse类中使用的项目。困难的部分是在编译时间期间对此进行验证。

此问题的简单答案是使用标记接口

在约书亚·布洛赫(Joshua Bloch)的有效爪哇(Java)中,他写道:

标记接口比标记注释具有两个优点。第一的 最重要的是,标记接口定义了由 标记级别的实例;标记注释没有。这 这种类型的存在使您可以在编译时间捕获错误 如果使用标记注释,您才能捕获直到运行时。

因此,我上面提出的问题是无效的。如果您想在编译时捕获错误,则不应使用标记注释。将自定义注释更改为接口后,我指定了有限的通用类,如下所示:

HTTPResponse with public class HttpResponse<T implements MyCustomInterface> {
    //fields, getters, setters
}

最新更新