我想用@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/

10-09 19:31