我是Java的新手。我能够编译以下界面而没有任何错误。
文件名 :empty_interface.java
文件内容:
public interface empty_interface {}
问题
a)我相信接口是实现者必须执行的合同。如果扩展上述接口,实现者将实现什么?
b)可能与a)有关......但是我走了......为什么编译器会允许未定义的接口成功编译?
我是Java的新手。我能够编译以下界面而没有任何错误。
文件名 :empty_interface.java
文件内容:
public interface empty_interface {}
问题
a)我相信接口是实现者必须执行的合同。如果扩展上述接口,实现者将实现什么?
b)可能与a)有关......但是我走了......为什么编译器会允许未定义的接口成功编译?
JDK 中已经有许多“标记”接口。这只是表示不需要方法的东西。
最常见的例子是 Serializable,它表示类可以被序列化。该库会完成其余的工作,因此不需要其他方法。
一个晦涩的方法是 RandomAccess,它表示可以以有效的方式随机访问 List。Collections.sort() 使用它。
另一个类是 Cloneable,它是一个标记接口,但可能应该有一个方法
public Object clone();
从 Java 5.0 开始,添加此类元信息的更好方法是使用 Annotations,但这些以前不可用。
这是 Jon Skeet 对 java 中类似问号界面的出色回答
空接口是满足多个角色的标记接口。
序列化需要一个实现Serializable
. 接口存在的唯一原因是在缺席的情况下标记不可序列化的类(以及那些开发人员不关心序列化的类),并使他们自己的类的开发人员考虑他们的类是否是可序列化的。
奇怪的是Serializable
提到了几个可选的方法。
另一个假设有效但不是很有用的用途是接受多个不相关的类而不接受所有所说的类。
接口不是未定义的,它只是没有为它定义的方法。
空接口通常用作类是否支持某些行为的标志。
这是否是一个好的模式存在争议,实践中的一个很好的例子是Cloneable和Serializable。Cloneable 让您知道实现它的类可以通过 克隆Object.clone
,而 Serializable 让您知道实现类允许序列化。
我个人认为这没有什么问题。