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 - Hibernate插入后可以自动选择吗?

java - 基于另一个列表的 1 个列表的流过滤器

java - 查找集合内的值并比较值字段

objective-c - @interface 多重继承?

java - 这个语法是什么意思 (List<? extends Number> data)

java - idea无法导入maven项目

java - 对本地主机服务器的简单 retrofit2 请求

java - 如何从两个数组列表中删除不常见的元素

c# - 为什么核心类型只实现了部分接口(interface)?

pointers - 关于接口(interface)分配