【问题标题】:interface as a reference variable接口作为参考变量
【发布时间】:2017-06-26 04:41:21
【问题描述】:
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 = 新的子(); // 其中 sub 是 sup 的子类。这里 sup 是返回类型,sub 是对象类型。

【问题讨论】:

  • 除非返回null,否则你打算如何在不创建abc 的对象的情况下实现meth2 方法?在后一种情况下,c 的值将是null
  • 请遵守 Java 命名约定(例如 Abc 用于类型)并标识您的代码
  • 如果你想要一个abc 类型的对象,你必须定义一个实现它的类(尽管它可以是一个匿名类)。我不清楚你认为如何在不实现接口的情况下做任何有用的事情。
  • 我在理解 getAnnotations() 方法时遇到了类似的问题,该方法的返回类型为 Annotation[] 并且 Annotation 是一个接口。
  • 某处有一个类实现了Annotation(可能不止一个这样的类)。它可能是隐藏在 Java 运行时库中的某个私有类。

标签: java class interface


【解决方案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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2020-04-02
        • 2012-10-05
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多