Java 不同等级的arraylist不带强制转换?

Java 不同等级的arraylist不带强制转换?,java,arraylist,Java,Arraylist,首先让我说,我搜索了几个小时,没有找到我需要的东西 我需要运行一系列类应用程序,并使用当前应用程序的变量和方法 public class App { public final Integer number = 0; } public class Player extends App { public final Integer number = 1; } public class Navigation extends App { public final Integer n

首先让我说,我搜索了几个小时,没有找到我需要的东西

我需要运行一系列类应用程序,并使用当前应用程序的变量和方法

public class App {
   public final Integer number = 0;
}

public class Player extends App {
   public final Integer number = 1;
}

public class Navigation extends App {
   public final Integer number = 2;
}

public class Phone extends App {
   public final Integer number = 3;
}


private ArrayList<App> apps = new ArrayList<App>();

apps.add(new Player());
apps.add(new Navigation());
apps.add(new Phone());
我获取父应用程序的编号

如果我把它扔给玩家

(Player) apps.get(0).number //  = 1
我得到了想要的结果

现在,我想运行所有N个应用程序,在应用程序中的多个位置可以超过3个 但我不想这样做:

if (gun instanceof Player)
{
   Player p = (Player) apps.get(0);

}else if .... N times... in N places
我也不想让应用程序成为一个界面,因为我需要应用程序的默认设置

如果您有更好的想法,就没有必要使用arraylist


提前感谢。

使用方法而不是最终变量。则每个类都可以重写该方法以返回适当的值。每个类都可以返回相同的常量,但是将常量定义为private,并确保使用getter方法

使用方法而不是最终变量。则每个类都可以重写该方法以返回适当的值。每个类都可以返回相同的常量,但将该常量定义为private,并确保使用getter方法

使用抽象方法或接口:

摘要方法:

public absteact class App {
    public absteact int getNumber();
}

public class Player extends App {
    public int getNumber() {return 1:}
}
// etc
接口:

public interface HasNumber {
     public int getNumber();
}

public absteact class App implements HasNumber {
}

public class Player extends App {
    public int getNumber() {return 1:}
}
// etc

从经典设计的角度来看,界面版本更可取,但两者都可以接受

使用抽象方法或界面:

摘要方法:

public absteact class App {
    public absteact int getNumber();
}

public class Player extends App {
    public int getNumber() {return 1:}
}
// etc
接口:

public interface HasNumber {
     public int getNumber();
}

public absteact class App implements HasNumber {
}

public class Player extends App {
    public int getNumber() {return 1:}
}
// etc

从经典设计的角度来看,接口版本更可取,但两者都可以接受。基本问题是,在Java中,数据成员不是多态的。这意味着:

public class Player extends App {
   public final Integer number = 1;
}
不覆盖App.number。它所做的是创建一个与App.number完全无关但又称为number的新数据成员

因此,当您执行obj.number时,只有obj的编译时类型决定访问哪个编号。obj的运行时类型与此无关

要实现多态行为,请使用以下方法:

public class App {
   public Integer getNumber() { return 0; }
}

public class Player extends App {
   @Override
   public Integer getNumber() { return 1; }
}

...

一种更简洁的方法是将App转换为抽象类或接口,这样App.getNumber就可以是抽象的,并且必须在派生类中重写。

基本问题是,在Java中,数据成员不是多态的。这意味着:

public class Player extends App {
   public final Integer number = 1;
}
不覆盖App.number。它所做的是创建一个与App.number完全无关但又称为number的新数据成员

因此,当您执行obj.number时,只有obj的编译时类型决定访问哪个编号。obj的运行时类型与此无关

要实现多态行为,请使用以下方法:

public class App {
   public Integer getNumber() { return 0; }
}

public class Player extends App {
   @Override
   public Integer getNumber() { return 1; }
}

...

一种更简洁的方法是将App制作成抽象类或接口,这样App.getNumber是抽象的,必须在派生类中重写。

您可以用一个方法创建一个接口,并在所有类中实现该接口的方法,所有这些类都将添加到ArrayList中,然后您可以直接获得number的值,检查一下样品,它可能会对你有所帮助

import java.util.ArrayList;

public class Manager1 {

public static void main(String[] args) {
    ArrayList<App> list = new ArrayList<App>();
    list.add(new Playre());
    list.add(new Navigation());
    list.add(new Phone());

    System.out.println(list.get(0).getNumber());
}
}

interface App {
public abstract int getNumber();
}
class Playre implements App {
private final int number = 1;
@Override
public int getNumber() {
    return number;
}
}
class Navigation implements App {
private final int number = 2;
@Override
public int getNumber() {
    return number;
}
}
class Phone implements App {
private final int number = 3;
@Override
public int getNumber() {
    return number;
}
}

您可以用一个方法创建一个接口,并在所有类中实现该接口的方法,您将在ArrayList中添加这些方法,然后您可以直接获得number的值,检查示例它可能会对您有所帮助

import java.util.ArrayList;

public class Manager1 {

public static void main(String[] args) {
    ArrayList<App> list = new ArrayList<App>();
    list.add(new Playre());
    list.add(new Navigation());
    list.add(new Phone());

    System.out.println(list.get(0).getNumber());
}
}

interface App {
public abstract int getNumber();
}
class Playre implements App {
private final int number = 1;
@Override
public int getNumber() {
    return number;
}
}
class Navigation implements App {
private final int number = 2;
@Override
public int getNumber() {
    return number;
}
}
class Phone implements App {
private final int number = 3;
@Override
public int getNumber() {
    return number;
}
}

我想在我们提供帮助之前,我们需要知道你打算对玩家等类型做什么。如果你想用不同的类型做同样的事情,那么你通常会让他们实现一个接口,或者对一个特定类型进行子类化。我想我们需要知道你打算用播放器等类型做什么,然后我们才能提供帮助。如果您想对不同的类型执行相同的操作,那么您通常会让它们实现一个接口,或者为特定类型创建子类。