在下面的示例中,是否有像ClassDef中的IntDef这样的annotation来限制annotation的类型?

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


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

最佳答案

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

它只能由运行时容器(例如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
}

10-07 12:22