我最近开始学习 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/