从HashMap

时间:2018-05-15 07:37:11

标签: java arraylist hashmap abstract-class

我创建了一个HashMap,其中键作为类,Value作为Abstract Class的ArrayList,我希望从Abstract类元素中获取ID或名称。 但是,当从ABSTRACT CLASS访问元素时,它只返回抽象类中的元素,而不返回扩展Abstract类的类中的方法。 有没有办法获得扩展抽象类的方法的入口,而不用改变我的抽象类来包含这些字段。

private HashMap<Persoana,ArrayList<Account>>Unu; 
    for (Entry<Persoana, ArrayList<Account>> entry : Unu.entrySet()) {
        if (entry.getValue().get(i).getClass().???) {
            System.out.println("found"+entry.getKey() + "/" + entry.getValue());
            return entry.getValue();
        }
        i++;
        System.out.println(entry.getValue()); 
    }
    return null;
}

我的asbtract课程:

public abstract class Account  extends Observable{
    public abstract void retragere(int sumaDeRetras);
    public abstract void depunere(int sumaDeDepunere);

}

扩展我的抽象类的类和我希望在main中访问的方法。

   public class SavingsAccount extends Account {
        private long suma;
        private Date dataRetragere ;
        private Date dataDepunere;
        private int interest=5;
        private int IBAN;
        private int idClient;
        private long watchedSum;
public int getIBAN() {
        return IBAN;
    }}

3 个答案:

答案 0 :(得分:1)

您基本上可以使用instanceof检查具体类,然后转换实例。所以在你的情况下看起来像:

private HashMap<Persoana,ArrayList<Account>>Unu; 

for (Entry<Persoana, ArrayList<Account>> entry : Unu.entrySet()) {
    for (Account account : entry.getValue() {
        if (account instanceof SavingsAccount) {
            SavingsAccount savingsAccount = (SavingsAccount) account;

            System.out.println("found "+savingsAccount.getIBAN());
        }
    }
}

答案 1 :(得分:0)

您可以向下转播然后调用方法,如:

Account accountValue = entry.getValue();
if(accountValue instanceOf SavingsAccount) {
    SavingsAccount savingAccountValue = (SavingsAccount)accountValue;
    System.out.println(savingAccountValue.getIBAN());
}

答案 2 :(得分:-1)

如果你知道具体的类,请使用上面答案中的强制转换。如果只知道具体方法,可以使用如下反射:

for (Entry<Persoana, ArrayList<Account>> entry : Unu.entrySet()) {
 for (Account a : entry.getValue()) {
  System.out.println(a.getClass().getSimpleName()); // Prints the name of the concrete class.
  try {
    System.out.println(a.getClass().getMethod("getIBAN").invoke(a));
  } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
        e.printStackTrace();
  }
 }
}

如果要列出该类的所有方法,也可以使用反射:

...
a.getClass().getMethods();
...