Java 如何区分超类的ArrayList中的子类

Java 如何区分超类的ArrayList中的子类,java,object,inheritance,Java,Object,Inheritance,我有2个子类(MultiCard和BasicCard),我想从类Bank中调用属于MultiCard的方法(addCurrency)。该方法用于在具有货币数组列表的MultiCard中添加更多货币。但是,由于MultiCard是class Card的子类,因此我无法访问MultiCard。所有卡都存储在列表卡中 我不想使用基于强制转换的解决方案(检查实例的,然后将卡的实例强制转换为多卡的) 超级班: public abstract class Card implements Comparable

我有2个子类(MultiCard和BasicCard),我想从类Bank中调用属于MultiCard的方法(addCurrency)。
该方法用于在具有货币数组列表的MultiCard中添加更多货币。但是,由于MultiCard是class Card的子类,因此我无法访问MultiCard。所有卡都存储在
列表卡中

我不想使用基于强制转换的解决方案(检查
实例的
,然后将
卡的
实例强制转换为
多卡的


超级班:

public abstract class Card implements Comparable<Card>, Cloneable
{
protected String id;
protected String name;
protected List<Purchase> purchases;
static int counter = 1000;

public Card(String name)
{
    counter++;
    this.id = Integer.toString(counter);
    this.name = name;
    this.purchases = new ArrayList<Purchase>();
}

由于这个问题有点让人困惑,我假设当您调用
user.getACard(carid,username,password)
方法时,您得到的是
Card
对象。理想的修复方法是调用
addCurency()
方法, 您可以在Card类中添加抽象方法
public boolean addCurrency(String currency)
(如果允许修改Card类)。
否则,您必须将
对象强制转换为
多卡
对象

由于这个问题有点让人困惑,我假设当您调用
user.getACard(carid,username,password)
方法时,您得到的对象是
Card
。理想的修复方法是调用
addCurency()
方法, 您可以在Card类中添加抽象方法
public boolean addCurrency(String currency)
(如果允许修改Card类)。
否则,您必须将
对象强制转换为
多卡
对象

请分享完整的代码。你的问题很令人困惑,我不明白你想达到什么目的。你好,我已经编辑了我的question@GlenioAlsinTan你已经编辑了这个问题,是的。但你没有说得更清楚。你的问题是什么?假设我们对您的代码一无所知(因为我们不知道),也不知道您想做什么(因为我们不知道)。:)@我猜是Abra数据结构。请分享完整的代码。你的问题很令人困惑,我不明白你想达到什么目的。你好,我已经编辑了我的question@GlenioAlsinTan你已经编辑了这个问题,是的。但你没有说得更清楚。你的问题是什么?假设我们对您的代码一无所知(因为我们不知道),也不知道您想做什么(因为我们不知道)。:)@我猜是Abra的数据结构。谢谢你的理解,这是下档吗?你知道克隆卡片的最好方法是什么吗,因为它是一个抽象对象,所以我使用了一个抽象的clone()并创建了clone()到子类,但是我得到了null*对不起,我的问题是混淆英语不是我的第一语言。演员阵容不会是向下的
user.getACard(…)
总是返回一个具体的对象(即MultiCard的对象)。但是,由于此方法的返回类型是Card类型,因此具体的Multicard对象总是被Card引用引用。当你在这里浇铸时,你只是将具体对象的参考更具体地用于Multicard。谢谢你的理解,浇铸是向下浇铸吗?你知道克隆卡片的最好方法是什么吗,因为它是一个抽象对象,所以我使用了一个抽象的clone()并创建了clone()到子类,但是我得到了null*对不起,我的问题是混淆英语不是我的第一语言。演员阵容不会是向下的
user.getACard(…)
总是返回一个具体的对象(即MultiCard的对象)。但是,由于此方法的返回类型是Card类型,因此具体的Multicard对象总是被Card引用引用。当您在这里进行铸造时,您只是使具体对象的引用更特定于Multicard。
public class MultiCard extends Card implements Cloneable
{
protected static List<String> currencies;
protected double[] balance;
public static final int currencyCount = 5;
public MultiCard (String name)
{
    super (name);
    currencies = new ArrayList<String>();
    balance = new double[currencyCount];
    currencies.add ("AUD");
    for (int i = 0; i < balance.length; i++)
        balance[i] = 0;
}
public boolean addCurrency (String currency)
{
    if (currencies.size () == currencyCount ||containsCurrency (currency)) {
        return false;
    }
    currencies.add (currency);
    return true;
}
private static final String[] currencyLabel = { "AUD", "NZD", "USD", "CND", "YEN", "BPD" };
private static final double[] currencyRate = { 1.0, 1.2, 0.75, 0.85, 80, 0.7 };
private String adminUsername;
private String adminPassword;

Map<String, User> users = new HashMap<>();// username

public Bank(String admName, String admPassword){
    this.adminUsername  = admName;
    this.adminPassword = admPassword;
public boolean addCurrency(String cardID, String username, String password, String currency) { ...
}
public boolean addCurrency(String cardID, String username, String password, String currency)
{
   User user = users.get(username);
   user.getACard(cardID, username, password); // here is my problem - a Card instance is returned, which must be cast to a MultiCard

}