【发布时间】:2019-06-29 18:23:57
【问题描述】:
[ANSWER EDIT]: 简短的回答是我想做的事情是不可能的。我的问题有点误导。我了解到Marker Interface 模式实际上就是我在问题中所说的标记注释(因为您创建的注释实际上是一个接口)。并且只能在运行时进行检查。因此,如果您希望很好地使用注释进行编译时检查,那是不可能的。空接口是唯一的选择。检查答案以了解如何在运行时执行此操作。
我试图避免使用标记接口来支持标记注释。基本上我想用这个注释标记一堆类,并将这些类的实例传递给接受该类型的方法。这是我的代码:
标记注释:
@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
我不确定我正在做的事情是否可行,但我读到标记接口可以替换为标记注释。这种情况下不可以吗?
谢谢
【问题讨论】:
-
你能提供一个更具体的代码示例吗?
-
@Aris_Kortex 已编辑
-
为什么不能把
Message做成接口并扩展MessageA? -
哦,我可以。但是在互联网上阅读时,它说这是一个标记接口(一个没有方法的接口)。并且这些可以用标记注释替换。我没有太多使用自定义注释,所以我什至不确定我想要做的事情是否可行。
-
我建议你现在使用一个接口,因为以后你可以向它添加方法并强制实现。
标签: java interface annotations