试图理解隐式超接口

时间:2012-09-17 09:05:55

标签: java

很抱歉带回dead。但我仍然不清楚这部分规范的内容。

  

如果接口没有直接的超级接口,那么接口   隐式声明带有签名的公共抽象成员方法m   s,返回类型r,以及对应于每个公共的throws子句t   具有签名s的实例方法m,返回类型r和throws子句t   在Object中声明,除非具有相同签名的方法相同   返回类型,并且显式声明了兼容的throws子句   界面。如果接口显式,则是编译时错误   在m被声明为final的情况下声明这样的方法m   在对象中。

鉴于

interface Testing
{
    void test();
}
public class Test{
    public static void main(String[] args) {
        Testing t = new Testing(){
            @Override
            public void test(){
            }
        };
        t.test();
        t.toString();
    }
}

现在规范声明上述内容将变为

    interface Testing
    {
        void test();
        String toString();
        //other non-final methods of Object
    }
    public class Test{
        public static void main(String[] args) {
            Testing t = new Testing(){
                @Override
                public void test(){
                }
            };
            t.test();
            t.toString(); 
        }
    }

另外。请确认是否存在接口层次结构,然后所有接口都获得这些抽象方法。

2 个答案:

答案 0 :(得分:1)

这意味着每个类都扩展了Object(在它的类heirarchy中的某个点)。但是,接口不会扩展Object。这是为了避免因多次出现而产生的问题。

由于接口不扩展Object,这意味着如果我们访问的对象的类型(不是类)是接口,我们就无法使用toString之类的方法。但我们知道这些方法必须可用,因为所有类在某些时候都延伸到Object。因此,为了解决这个问题,在没有超接口的所有接口中隐式声明所有Object的最终方法。这些方法的这些合同总是得到满足,因为所有类在某些时候都必须从Object延伸。

TL; DR - 这是一个技巧,以确保我们可以访问Object提供的方法,当我们有一个类的实例存储在变量中时,类型是一个接口(例如。{{1} })

编辑:要回答你的问题,请稍微关闭一下。 Serializable的所有非final方法都被添加到接口(无论它们是否被使用),如果该接口没有父接口AND并且每个要添加的方法:接口显式声明没有匹配方法

答案 1 :(得分:0)

只要没有接口的超级接口,它就会获得Object类方法的隐式声明。只要这些方法包含在界面中。扩展或实现此接口的每个接口都没有看到此接口显式声明的方法或隐式获得的方法之间的差异。那一点,接口与明确声明它们一样好。