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

时间:2016-06-17 21:40:41

标签: java generics compilation annotations

如果使用泛型,我可以在编译期间检查某个类是否包含特定的注释吗?

我正在创建一个包装类,它将作为对各种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对象并声明&#39;数据的类型。领域:

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

这个想法是,任何试图使用这个类的人都可以在构建期间传递他们自己的自定义POJO。但是,我希望能够检查在构造期间传入的对象是否使用我创建的自定义接口进行注释。

例如,我的SomePOJO类需要如下所示:

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

有没有办法在编译期间检查SomePOJO类是否使用@MyCustomInterface注释?

我知道我可以标记我的注释,以便它在运行时可用,然后在HTTPResponse类的构造函数中执行检查。但我真的希望我的班级用户尽快(在编译期间)知道他们还没有用正确的接口标记他们的POJO,因此需要在创建HTTPResponse对象之前这样做。

在这种情况下,注释是否是正确的方法?在编译时以某种方式检查类注释是否100%是不可能的,我应该强制用户实现我的自定义接口然后指定

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

感谢您的阅读,如果您能成功实现这一目标!

1 个答案:

答案 0 :(得分:0)

上面我的自定义注释的目的是将一个类标记为可以在HTTPResponse类中使用的项。困难的部分是在编译时期间验证这一点。

这个问题的简单答案是使用标记界面

在Joshua Bloch的Effective Java中,他写道:

  

标记接口比标记注释有两个优点。第一   最重要的是,标记接口定义了一个由其实现的类型   标记类的实例;标记注释没有。该   这种类型的存在允许您在编译时捕获错误   如果您使用了标记注释,则无法在运行时捕获。

因此,我上面提出的问题无效。如果您确实希望在编译时捕获错误,则不应使用标记注释。将我的自定义注释更改为接口后,我按如下方式指定了我的有限泛型类:

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