我想用@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)”。有没有一种方法可以定义仅允许带有给定注释的对象的集合?
最佳答案
最简洁的答案是不。
您的问题是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
}
};
关于java - Java:允许带有自定义注释的对象的集合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3953963/