为啥我们要实现标记接口,即使它们不包含任何方法? [复制]

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,它会执行一些操作以支持克隆。

【讨论】:

不,编译器不关心它,并且不会向实现标记接口的类添加任何行为。

以上是关于为啥我们要实现标记接口,即使它们不包含任何方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为什么这些java接口没有抽象方法?浅谈Java标记接口

为啥在实现接口方法时允许使用虚拟?

泛型有啥好处,为啥要使用它们?

为啥在实现类的方法名称之前会包含接口引用? [复制]

█■为啥要用实现接口的类实例化接口呢? ?

抽象类与接口学习总结