Marker接口和空接口的区别?
Difference between Marker interface and empty interface?
每个Marker接口都是一个空接口。反之亦然吗?
Every Marker interface is an empty interface. Is vice-versa also correct?
没有。一个没有意义的空界面不是标记界面......在任何有用的意义上。标记接口必须表示 关于实现它的 class 有意义的东西。
事实上,根据某些定义,(混合)标记接口可以包含方法(请参阅下面的维基百科定义)。所以标记界面不一定是一个空界面。
@Sudheep Vallipoyil 在他的回答中说。
1) It is not possible to create a user-defined marker interface.
我不同意。这是基于 "marker interface" 的狭义定义,这不是普遍接受的定义。
相比之下,这里是Wikipedia如何定义"marker interface"和相应的设计模式。
"The marker interface pattern is a design pattern in computer science, used with languages that provide run-time type information about objects. It provides a means to associate metadata with a class where the language does not have explicit support for such metadata."
"To use this pattern, a class implements a marker interface (also called tagging interface), and methods that interact with instances of that class test for the existence of the interface. Whereas a typical interface specifies functionality (in the form of method declarations) that an implementing class must support, a marker interface need not do so. The mere presence of such an interface indicates specific behavior on the part of the implementing class. Hybrid interfaces, which both act as markers and specify required methods, are possible but may prove confusing if improperly used."
Joshua Bloch 的第二个定义是:
"A marker interface is an interface that contains no method declaration, but merely designates (or "marks") a class that implements the interface as having some property."
如您所见,在正常接受的用法中,术语"marker interface"并未为JVM定义的接口保留。任何人都可以定义一个。
另请参阅:
- Marker Interfaces in Java?
首先我们可以将一个接口称为标记接口,如果它不包含任何成员,它用于向 JVM 指示实现 运行 时间行为 class .
每个空接口都不是标记接口,因为
1)无法创建user-defined标记界面
2)你写的空接口仍然可以扩展任何其他非空接口(那么即使空接口也有一些继承的成员)。
更好理解,例如使用标记接口的需要被替换为使用来自java 5 的注释。(通过这个你可以理解标记接口的含义)
此回答是对@Stephen C 的回答发表评论
1.The问题不是什么是Marker interface pattern。(就像问什么是iterator,什么是iterator pattern)
2.The wiki 定义是针对 'marker interface design pattern' 而不是 java
中的标记界面概念
3.from 有效 java by Joshua 你可以找到标记接口的以下定义
"A marker interface is an interface that contains no method declaration,but merely designates(or "marks") 一个 class 将接口实现为具有一些 属性."
他还解释了为什么完整的一个空接口的Set(collection frame work)不是一个Marker接口
我不认为答案应该是从 wiki 复制一些定义并解释相同的东西(那也是不相关的!)
你错了!!!我不知道你从哪里得到这些信息?来自 java SE 7 程序员学习指南提到“接口是一组 public 必须由使用接口的 class 实现的方法。”接口就是接口,如果它发生了变化,我应该在上面提到的这类书籍中阅读它。如果像 Cloneable 这样的接口没有 public 方法,意味着它没有 public 方法,但是任何实现它的 class 必须实现 Object.clone() 作为 public.就是这个意思!!!拜托,不要把这么简单的事情变成复杂的讨论,尤其是在面试的时候!!
每个Marker接口都是一个空接口。反之亦然吗?
Every Marker interface is an empty interface. Is vice-versa also correct?
没有。一个没有意义的空界面不是标记界面......在任何有用的意义上。标记接口必须表示 关于实现它的 class 有意义的东西。
事实上,根据某些定义,(混合)标记接口可以包含方法(请参阅下面的维基百科定义)。所以标记界面不一定是一个空界面。
@Sudheep Vallipoyil 在他的回答中说。
1) It is not possible to create a user-defined marker interface.
我不同意。这是基于 "marker interface" 的狭义定义,这不是普遍接受的定义。
相比之下,这里是Wikipedia如何定义"marker interface"和相应的设计模式。
"The marker interface pattern is a design pattern in computer science, used with languages that provide run-time type information about objects. It provides a means to associate metadata with a class where the language does not have explicit support for such metadata."
"To use this pattern, a class implements a marker interface (also called tagging interface), and methods that interact with instances of that class test for the existence of the interface. Whereas a typical interface specifies functionality (in the form of method declarations) that an implementing class must support, a marker interface need not do so. The mere presence of such an interface indicates specific behavior on the part of the implementing class. Hybrid interfaces, which both act as markers and specify required methods, are possible but may prove confusing if improperly used."
Joshua Bloch 的第二个定义是:
"A marker interface is an interface that contains no method declaration, but merely designates (or "marks") a class that implements the interface as having some property."
如您所见,在正常接受的用法中,术语"marker interface"并未为JVM定义的接口保留。任何人都可以定义一个。
另请参阅:
- Marker Interfaces in Java?
首先我们可以将一个接口称为标记接口,如果它不包含任何成员,它用于向 JVM 指示实现 运行 时间行为 class . 每个空接口都不是标记接口,因为
1)无法创建user-defined标记界面
2)你写的空接口仍然可以扩展任何其他非空接口(那么即使空接口也有一些继承的成员)。
更好理解,例如使用标记接口的需要被替换为使用来自java 5 的注释。(通过这个你可以理解标记接口的含义)
此回答是对@Stephen C 的回答发表评论
1.The问题不是什么是Marker interface pattern。(就像问什么是iterator,什么是iterator pattern)
2.The wiki 定义是针对 'marker interface design pattern' 而不是 java
中的标记界面概念3.from 有效 java by Joshua 你可以找到标记接口的以下定义
"A marker interface is an interface that contains no method declaration,but merely designates(or "marks") 一个 class 将接口实现为具有一些 属性."
他还解释了为什么完整的一个空接口的Set(collection frame work)不是一个Marker接口
我不认为答案应该是从 wiki 复制一些定义并解释相同的东西(那也是不相关的!)
你错了!!!我不知道你从哪里得到这些信息?来自 java SE 7 程序员学习指南提到“接口是一组 public 必须由使用接口的 class 实现的方法。”接口就是接口,如果它发生了变化,我应该在上面提到的这类书籍中阅读它。如果像 Cloneable 这样的接口没有 public 方法,意味着它没有 public 方法,但是任何实现它的 class 必须实现 Object.clone() 作为 public.就是这个意思!!!拜托,不要把这么简单的事情变成复杂的讨论,尤其是在面试的时候!!