【问题标题】:Polymorphic behavior involving Java Interface涉及 Java 接口的多态行为
【发布时间】:2017-05-13 00:25:41
【问题描述】:
interface MyInterface {

      public List<String> getNames();
}

class MyClass implements MyInterface {

     @Override
     public List<String> getNames() {
         ... 
         return names;
     }     
     public List<String> getTypes() {
          ...
           return types;
     }
}

class MyClassFactory {

    public MyInterface create() {
        ...
        MyInterface myClass = new MyClass();
        return myClass;
    }
}

public class MyClient {

   MyInterface myClass = myClassFactory.create();
   List<String> types = myClass.getTypes();
}

在这段代码中,它抱怨最后一行,“List types = myClass.getTypes();”这表示该方法未为该类定义。这是为什么?这不是使用多态行为的正确方法吗?

【问题讨论】:

  • 你没有在界面中定义getTypes,所以一旦你隐式转换到界面,它是不可见的。
  • myClassMyInterface 的实例,因此它看不到getTypes() 函数。您可以尝试将其投射到您的班级以查看它。 List&lt;String&gt; types = ((MyClass) myClass).getTypes();

标签: java interface object-oriented-analysis


【解决方案1】:

这不是使用多态行为的正确方法吗?

如果您调用接口中定义的方法getNames(),这将是一种完美的接口编程方式。但是,getTypes() 只定义在类中,而不是在接口中。不允许编译器使用此信息,因此它发出错误。

您可以通过在接口中添加getTypes() 或将myClass 变量的编译时类型更改为MyClass 来解决此问题。

【讨论】:

    【解决方案2】:

    Put "public List getTypes();"在 MyInterface. 或在您的 MyClient 类中使用

    MyClass myClass = (MyClass) myClassFactory.create();
    

    这一行而不是`

    MyInterface myClass = myClassFactory.create();
    

    【讨论】:

      猜你喜欢
      • 2011-08-24
      • 1970-01-01
      • 2022-01-18
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      相关资源
      最近更新 更多