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