在下面的示例中,是否有像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所说的,请覆盖您的方法。我不知道什么逻辑需要一起处理
String
,Integer
和Long
。但是,如果您确实需要,可以执行以下操作: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
}