接口作为引用变量

时间:2017-06-26 04:41:22

标签: java class interface

interface abc
{
   ...
}

假设我的方法的返回类型为Object,接口类型为abc

class xyz
    {

    Object meth ()
    {
        ... 
    }

    abc meth2()
    {
        ...
    }

    public static void main (String args[])
    {
        xyz x = new xyz() ;

        Object a = x.meth() ;

        abc c = x.meth2() ;
    }
}

我不想实现接口abc。 引用变量c的类型为abc,但c的对象类型是什么? 我们不能创建接口的对象,那么它可能是什么?

例如: sup s = new sub(); //其中sub是sup的子类。这里的sup是返回类型,sub是对象类型。

3 个答案:

答案 0 :(得分:1)

c的基础类型可以是实现abc的任何内容。实际类型取决于您meth2的实现。

“但是在我的代码中,没有任何实现abc!”你说。如果没有实现abc,则无法实现meth2。它永远不会返回正确的值,因为如果没有类型实现abc,它就无法创建与abc兼容的类型。

但是,在meth2中,您可以创建所谓的“匿名类”:

return new abc() {
    // all the methods required by abc will be put here...
};

在编译期间,这个匿名类将变成实现abc的封闭类的内部类,并且它将具有类似yourpackage.EnclosingClass$1

之类的完全限定名称。

答案 1 :(得分:0)

为了回答您的问题,您必须首先考虑编写meth2()的可能方法。您必须在某处实现ABC接口。你可以这样做:

ABC meth2() {

    return new ABC(){
         // Implement the methods that are defined in ABC interface
    };
}

答案 2 :(得分:0)

方法meth2只能返回null或实现接口abc的类的实例。