首页 > 解决方案 > 限制注释的类类型

问题描述

有没有ClassDef像我下面IntDef的例子那样annotation限制类型annotation

@ClassDef({
    Integer, String, Long
})
public @interface MyRestrictedData {
}

因此,我可以将其用作:public void showData(@MyRestrictedData Object myData)

标签: javaandroidannotations

解决方案


注释处理器无法解决此要求。

它只能通过运行时容器来完成,比如 Spring。

但实际上,容器只是帮您通过代理检查它。为什么你不能自己做?像这样:

public class MyRestrictedData {
  public static void check(Object o){
    if(!(String.class.isInstance(o) || Integer.class.isInstance(o) || Long.class.isInstance(o)))
      throw new IllegalArgumentException("Must be String, Integer or Long.");
  }
}

public void showData(Object myData) {
  MyRestrictedData.check(myData);
  // then do your work
}

编辑

如果你真的想在编译期间检查,唯一的方法就是 zhh 所说的,覆盖你的方法。我不知道需要处理什么逻辑StringIntegerLong一起处理。但如果你真的需要,你可以这样做:

public void showData(String s){
  showData((Object)s);
}

public void showData(Integer i){
  showData((Object)i);
}

public void showData(Long l){
  showData((Object)l).
}

private void showData(Object o){
  // do your work here, note this method is PRIVATE
}

推荐阅读