【问题标题】:Specify Bounded Type Parameter containing an annotation during compile time?在编译期间指定包含注释的有界类型参数?
【发布时间】:2016-06-17 21:40:41
【问题描述】:

如果使用泛型,我能否在编译时检查类是否包含特定注解?

我正在创建一个包装类,它将作为对各种 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
}

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

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

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

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

感谢您阅读,如果您设法做到了这一点!

【问题讨论】:

    标签: java generics compilation annotations


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-11
      • 2012-01-11
      • 2023-03-27
      • 1970-01-01
      • 2016-06-26
      • 1970-01-01
      • 2020-11-21
      • 2023-03-09
      相关资源
      最近更新 更多