我想用@MyEntity注释
注释一些类public @interface MyEntity {}
@MyEntity
public class MyClass { ... }
定义一个集合,其中只允许带有该注释的类(不需要将它们定义为public class MyClass implements XXX
):
List<MyEntity> list = new ArrayList<MyEntity>();
list.add(new MyClass())
上面的代码导致编译错误“ArrayList类型中的方法add(MyEntity)不适用于参数(MyClass)”。有没有办法定义一个只允许具有给定注释的对象的集合?
答案 0 :(得分:3)
不要认为这是可能的。为什么不让它们实现无方法接口?
答案 1 :(得分:3)
简短的回答是否定的。
您的问题是List<MyEntity>
定义了MyEntity或其子类的列表(即如果我们有@interface AnotherEntity extends MyEntity
,那么我们可以将AnotherEntity
添加到此列表中。
类MyClass
不会扩展/实现MyEntity
,而是使用它进行注释。
即使有可能,也不会有效率。您不知道哪些方法或字段可用,MyEntity
没有描述您的对象的界面。因此,它唯一可以用来过滤错误的插入。您可以轻松实现它,并提供List实现:
List<?> myEntities = new LinkedList<?> {
@Override
public boolean add(Object obj) {
if (obj != null && obj.getClass().isAnnotationPresent(MyEntity.class)) {
return super.add(obj);
}
throw new IllegalArgumentException("Only objects annotated with MyEntity are allowed");
}
@Override
public boolean addAll(Collection<?> objs) {
//something similar, maybe with Collections2.filter from Google Collections
}
};
答案 2 :(得分:1)
注释的存在不会修改带注释的类的类型。
您可以创建仅包含使用注释注释的元素的集合。您需要为使用反射的集合创建一个包装类,以检查插入时是否存在注释。
它仍然不会让你进行编译时类型检查。为此你需要一些直接影响可插入项的类型(接口或超类等)的东西
答案 3 :(得分:0)
只需覆盖list:add,addAll和constructors的方法,即可过滤具有预期注释的类。