Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 标记接口和空接口之间的区别?_Java_Interface_Marker Interfaces - Fatal编程技术网

Java 标记接口和空接口之间的区别?

Java 标记接口和空接口之间的区别?,java,interface,marker-interfaces,Java,Interface,Marker Interfaces,每个标记接口都是空接口。反之亦然吗 每个标记接口都是空接口。反之亦然吗 没有。没有意义的空接口不是标记接口。。。在任何有用的意义上。标记接口必须表示实现它的类的一些有意义的东西 事实上,根据一些定义,(混合)标记接口可以包含方法(参见下面的Wikipedia定义)。所以标记接口不一定是空接口 @苏迪普·瓦利波伊尔在回答中说 1) 无法创建用户定义的标记界面 我不同意。这是基于“标记接口”的狭义定义,该定义不是普遍接受的定义 相比之下,这里是如何定义“标记接口”和相应的设计模式的 标记接口模式是

每个标记接口都是空接口。反之亦然吗

每个标记接口都是空接口。反之亦然吗

没有。没有意义的空接口不是标记接口。。。在任何有用的意义上。标记接口必须表示实现它的类的一些有意义的东西

事实上,根据一些定义,(混合)标记接口可以包含方法(参见下面的Wikipedia定义)。所以标记接口不一定是空接口


@苏迪普·瓦利波伊尔在回答中说

1) 无法创建用户定义的标记界面

我不同意。这是基于“标记接口”的狭义定义,该定义不是普遍接受的定义

相比之下,这里是如何定义“标记接口”和相应的设计模式的

标记接口模式是计算机科学中的一种设计模式,与提供有关对象的运行时类型信息的语言一起使用。它提供了一种将元数据与该语言不明确支持此类元数据的类相关联的方法

要使用此模式,类实现标记接口(也称为标记接口),与该类实例交互的方法测试接口的存在。而典型接口指定功能(以方法声明的形式)实现类必须支持的标记接口不需要这样做。仅存在这样一个接口就表明实现类的特定行为。混合接口既可以作为标记,也可以指定所需的方法,但如果使用不当,可能会造成混淆。”

Joshua Bloch的第二个定义是:

标记接口是一个不包含方法声明的接口,只是将实现该接口的类指定(或“标记”)为具有某些属性

如您所见,在正常的公认用法中,“标记接口”一词并不是为JVM定义的接口保留的。任何人都可以定义一个

另见:


首先,如果接口不包含任何成员,并且用于向JVM指示实现类的运行时行为,我们可以将其称为标记接口。 每个空接口都不是标记接口

1) 无法创建用户定义的标记界面

2) 您正在编写的空接口仍然可以扩展任何其他非空接口(即使空接口也有一些继承的成员)


更好的理解是,使用java 5中的注释取代了使用标记接口的需要。(通过这一点,您可以理解标记接口的含义)

此答案是对@Stephen C的答案进行评论

1.问题不是什么是标记接口模式(就像问什么是迭代器,什么是迭代器模式)

2.wiki的定义是“标记接口设计模式”,而不是java中的标记接口概念

3.从Joshua的《有效java》中,您可以找到以下标记接口的定义

标记接口是一个不包含方法声明的接口,只是将实现该接口的类指定(或“标记”)为具有某些属性

他还解释了为什么集(收集框架)是一个完整的空接口,而不是一个标记接口


我不认为答案应该是从维基上复制一些定义并解释相同的定义(这也是不相关的定义!)

你错了!!!我不知道你是从哪里得到这些信息的?《JavaSE7程序员学习指南》中提到“接口是一组公共方法,必须由使用接口的类来实现。”接口就是接口,如果它发生了变化,我应该在上面提到的这本书中阅读。如果像Cloneable这样的接口没有公共方法,则意味着它没有公共方法,但实现它的任何类都必须将Object.clone()实现为public。这就是它的意思!!!请不要把这么简单的事情变成复杂的讨论,尤其是在面试中

可能重复,而不是相反。为了得到一个清晰的概念,您关于不可能创建用户定义的标记接口的断言基于“标记接口”的狭义定义这不是普遍接受的定义。@StephenC我的答案是指向什么是标记接口,而不是指向什么是标记接口模式。我认为这就像java中的迭代器和迭代器设计模式之间的区别。我可以说,在java中创建用户定义的标记接口是不可能的,如果这样做,您应该能够指导jvm,或者应该能够重新编写JavaAPI。为什么不试试呢。试着编译这个:“公共接口MyMarker{}”。对于JVM来说,编写/编译/使用自己的标记接口并不是问题。显然,JVM不理解作为标记的
MyMarker
的含义,但它不理解>>need@StephenC我不认为如果你正在创建公共接口MyMarker,它不是一个marker接口,这是一个空接口,而且问题是关于2之间的区别。然后你可以问为什么我们需要创建一个空接口。这可以是一个设计决策,就像只是保留一些类型供以后修改,或者是一个扩展另一个类型的中间接口。或者我们可以编写一个,因为这样做没有人会抱怨。通过>>normal>is>normal我没有这个定义的参数。我的论点是你另一个回答中的这句话。“无法创建用户定义的标记接口。”。目前为止