我有一个类似下面的界面。
我在Eclipse中得到了这个默认代码。困惑,为什么会出现"@Override“属性?
在我们声明了所有这些方法并随后在Object类中实现的情况下,是否有其他可用的顶级默认接口?
public interface IRecord {
@Override
public String toString();
public void showName(String name);
}它的一个实现如下所示
public class Record implements IRecord{
@Override
public void showName(String name) {
//Doing something
}
}它像预期的那样得到了很好的编译,但我有点奇怪为什么它不要求我实现toString()方法的实现?
它在Object类中,但是Object类没有实现我的接口。
发布于 2013-05-24 20:01:39
所有类都隐式扩展了已经实现了toString()的Object。由于您的Record类实现了您的接口,并从Object继承了toString()方法,因此就履行了约定。
发布于 2013-05-24 20:30:45
在我们声明了所有这些方法并随后在Object类中实现的地方,有没有其他可用的顶级默认接口?
从Java Language Specification
如果接口没有直接的超接口,则接口隐式声明一个具有签名s、返回类型r的公共抽象成员方法m,并抛出与每个公共实例方法m相对应的抛出子句t,该方法具有在对象中声明的签名s、返回类型r和抛出子句t,除非接口显式声明了具有相同签名、相同返回类型和兼容的throws子句的方法。
换句话说,即使是一个空接口也会隐式地继承Object的所有公共方法。这就是Eclipse (正确地)添加@Override注释的原因。它很可能永远不会因为从Object中删除任何方法而失败,但它有助于避免输入错误:
interface IRecord {
@Override
public String toSTring();
}
Error: "The method toSTring() of type IRecord must override or implement a supertype method"请参阅问题第二部分的其他答案。
发布于 2013-05-24 20:04:23
接口不会从Object继承,但任何将实现您的接口的类都会继承,因此默认情况下会实现它。
您可能想知道为什么Eclipse在您的界面模板中提供了默认的重写toString:我认为这是为了提醒您以后要实现一些有意义的toString。
https://stackoverflow.com/questions/16734447
复制相似问题