Java:允许具有自定义注释的对象的集合

时间:2010-10-17 15:48:15

标签: java collections annotations

我想用@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)”。有没有办法定义一个只允许具有给定注释的对象的集合?

4 个答案:

答案 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的方法,即可过滤具有预期注释的类。