首页 > 解决方案 > 将 TYPE 注释传递给方法而不是标记接口

问题描述

[回答编辑]:简短的回答是我想做的事情是不可能的。我的问题有点误导。我了解到标记接口模式实际上就是我在问题中所说的标记注释(因为您创建的注释实际上是一个接口)。并且只能在运行时进行检查。因此,如果您希望很好地使用注释进行编译时检查,那是不可能的。空接口是唯一的选择。检查答案以查看如何在运行时执行此操作。


我试图避免使用标记接口来支持标记注释。基本上我想用这个注释标记一堆类,并将这些类的实例传递给接受该类型的方法。这是我的代码:

标记注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Message {
}

班级:

@Message
public class MessageTypeA {
}

方法:

public class DatabaseWriter {
    public void save(Message msg) {
        //some code
    }
}

调用代码:

MessageTypeA msgA = new MessageTypeA();
DatabaseWriter writer = new DatabaseWriter();
writer.save(msgA);

但是我得到Error:(78, 23) java: incompatible types: MessageTypeA cannot be converted to Message

我不确定我正在做的事情是否可行,但我读到可以用标记注释替换标记接口。在这种情况下不可能吗?

谢谢

标签: javainterfaceannotations

解决方案


标记接口模式是一种将元数据添加到运行时可读的程序类型或对象的方法。

例如,请参阅此模式的休眠实现。他们的insert方法接受一个 plain java.lang.Object,并且在该方法中使用来自各种注释的元数据。

所以,按照你的示例实现,我会用这样的东西

public class DatabaseWriter {
    public void save(Object msg) {
        if (msg.getClass().isAnnotationPresent(Message.class)) { 
           //some code
        }
    }
}

推荐阅读