为啥我们要实现标记接口,即使它们不包含任何方法? [复制]
Posted
技术标签:
【中文标题】为啥我们要实现标记接口,即使它们不包含任何方法? [复制]【英文标题】:Why do we implement marker Interface even if they doesn't contain any methods? [duplicate]为什么我们要实现标记接口,即使它们不包含任何方法? [复制] 【发布时间】:2014-02-15 03:24:18 【问题描述】:我一直在考虑这个但不能马上放弃它,为什么我们甚至会在我们的类中实现标记接口,即使它们不包含任何方法。请告诉我
【问题讨论】:
谢谢 Anjan,下一个会检查的。 @Nani *** 有一个很强大的search engine。 【参考方案1】:我们举个例子:Serializable。
如果您尝试序列化一个对象,如果您的对象不是 Serializable 的实例,Java 序列化机制将抛出异常。为了使它成为 Serializable 的实例,对象的类因此必须实现 Serializable 接口,即使该接口不包含任何方法。就这样
o instanceof Serializable
是真的,而不是假的。
【讨论】:
【参考方案2】:顾名思义,标记接口仅用于指示,它们标记实现该接口的类。
现在您可以在您的代码中对其执行一些操作,例如 (instance instanceof Marker)
在大多数地方注释可以用于标记
例如,如果一个类上的@Test
显示该类是一个测试类并且应该被执行。同样可以通过接口实现。
@Test //sort of marking
class ClassToTest
或
class ClassToTest implements Test
上面的例子在他们试图达到的目的上是同义的。
为了在第一种情况下检查是否存在,您将尝试检查 @Test
注释的存在,在第二种情况下,您将进行instanceof
检查。
使用标记接口,您还可以获得一个优势,即如果您存储所有 test 实例,那么您可以拥有一个类型安全的集合 List<Test>
,或者如果您想创建一个只接受 @ 实例的类型安全方法987654328@
void method(Test testInstance)
【讨论】:
【参考方案3】:对于调用者。 就像:接口A,实现B。 通常调用A。在spring框架中,很熟悉
【讨论】:
【参考方案4】:Marker 接口用作标记,将消息通知给 java 编译器,以便它可以向实现它的类添加特殊行为。
仔细查看 Java 中的标记接口,例如Serializable、Clonnable 和 Remote 看起来它们用于向编译器或 JVM 指示某些内容。因此,如果 JVM 看到一个 Class is Serializable,它会对其进行一些特殊操作,类似地,如果 JVM 看到一个 Class 实现 Clonnable,它会执行一些操作以支持克隆。
【讨论】:
不,编译器不关心它,并且不会向实现标记接口的类添加任何行为。以上是关于为啥我们要实现标记接口,即使它们不包含任何方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章