我创建了一个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;
}}
答案 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();
...