java - 使用接口(interface)作为父类(super class)时强制多态性的合适解决方案是什么

标签 java arraylist interface polymorphism

我最近开始学习 Java 编程语言,我想在模拟智能设备的应用程序上测试我的多态性知识。

我创建了一个名为 Os 的接口(interface),该接口(interface)的主要工作是指示其继承者应该为自己实现什么。

public interface Os {
   public ArrayList<App> getApps(); 
   public void installApps(Collection<App> apps);
}

然后我创建了两个类,一个用于 android,另一个用于 ios。 我还创建了一个名为 App 的接口(interface)以及两个继承自该接口(interface)的名为 AndroidApp 和 IosApp 的类。

现在我想尽可能多地使用多态性,但我很难理解哪个去哪里。我希望 Android 操作系统有一个自己的私有(private)集合,它只接受像这样的 AndroidApp 类型 ArrayList<AndroidApp> 但我想,因为我想实现接口(interface)的 getApps 方法,所以我不能将该方法的返回类型放入接口(interface)中,所以我需要层次结构中上层的东西,所以我将 android 操作系统的私有(private)列表更改为 ArrayList<App> .

我有一个方法负责在我拥有的 Osez 上安装应用程序。

public class Android implements Os {
    private ArrayList<App> androidApps;
    public void installApps(Collection<App> apps) {
      //I want to only install Android apps(adding them to my private collection
        for (App app : apps) {
            if(app instanceof AndroidApp){
              System.out.println("installing android app ... "   +app.getAppName()+" installed!");
                androidApps.add(app);
            }
            else
                System.out.println(app.getAppName()+" is not an android app!");
        }
    }
}

正如我之前提到的,getApps 负责将我选择的任何操作系统上已安装的应用程序返还给我。

这是一个概念性问题。我无法确定是否应该为 Android 和 Ios 使用更具体的集合。 像这样

public class AndroidOs{
    private Collection<AndroidApp> androidApps;
}

而不是使用

public class AndroidOs{
    private Collection<App> androidApps;
}

但是如果我使用第一个私有(private)集合,我的接口(interface)将失去其作为两个操作系统的通用接口(interface)的目的,因为当我尝试实现 getApps 时对于android我无法转换ArrayList<AndroidApp>ArrayList<App> .

抱歉,如果我的问题有点模糊,但我试图尽可能具体。

最佳答案

听起来您正在寻找 generic type parameter :

public interface Os<A extends App> {
   List<A> getApps(); 
   void installApps(Collection<A> apps);
}

public class Android implements Os<AndroidApp> {
    private ArrayList<AndroidApp> androidApps;

    @Override
    public void installApps(Collection<AndroidApp> apps) {
        for (AndroidApp app : apps) {
            System.out.println("installing android app ... "   +app.getAppName()+" installed!");
            androidApps.add(app);
        }
    }
}

关于java - 使用接口(interface)作为父类(super class)时强制多态性的合适解决方案是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39325726/

相关文章:

java - 从重写方法调用(非公共(public))方法

c# - 是否可以对具有显式实现的接口(interface)属性的类进行 json 序列化?

Java与Generic类的接口(interface)及其实现

java - 用poi写入excel文件

java - 我需要找到用户输入的特定变量,但我不明白如何

java - 如何仅通过提供大小来像在 Java 中一样在 Kotlin 中创建数组?

c# - 为什么 System.Runtime.InteropServices._Exception 不遵循 .NET 中接口(interface)的标准命名约定?

java - 从 Eclipse 调试尚未由运行配置启动的 Java 应用程序

java - 无法将 xml 转换为目标文件

java - Array List 用最后一个元素替换所有元素