【问题标题】:Converting Arraylists with abstract objects用抽象对象转换 Arraylist
【发布时间】:2018-11-06 23:08:54
【问题描述】:

大家早上好,

在编写我的 GUI 时,我的 Arraylist 遇到了问题。 在我的 Vereniging 类中有一个包含 Persoon 对象的 ArrayList,这些对象是 Lid 或 Medewerker。 现在我需要从该列表中过滤所有的 Lid 对象,并使用 Lid 对象创建一个新的 Arraylist。 有谁知道这是否可能? 我尝试运行增强的 for 循环并将对象添加到新的 Arraylist,但它说数据类型不符合(尝试将 Persoon 添加到 Lid 列表)

类;

验证

public class Vereniging {

private String naam;

private ArrayList<Persoon> personen;
private ArrayList<Vliegtuig> vliegtuigen;
private ArrayList<Vlucht> vluchten;
private ArrayList<Hangaar> hangaars;

private DataHandler handler = new Database();

public Vereniging(String naam){
    this.naam = naam;

    personen = new ArrayList<>();
    vliegtuigen = new ArrayList<>();
    vluchten = new ArrayList<>();
    hangaars = new ArrayList<>();
}

public ArrayList<Persoon> getPersonen() {
    return personen;
}

人物

public abstract class Persoon implements Comparable<Persoon>{

private String voornaam;
private String tussenvoegsel;
private String achternaam;
private String woonplaats;
private String geslacht;
private String rekeningnr;

Persoon(String voornaam, String tussenvoegsel, String achternaam, String 
woonplaats,
               String geslacht, String rekeningnr){
    this.voornaam = voornaam;
    this.tussenvoegsel = tussenvoegsel;
    this.achternaam = achternaam;
    this.woonplaats = woonplaats;
    this.geslacht = geslacht;
    this.rekeningnr = rekeningnr;
}

盖子

public class Lid extends Persoon {

private String gebnaam;
private String wachtwoord;
private String rol;

public Lid(String voornaam, String tussenvoegsel, String achternaam, String woonplaats, String geslacht,
           String rekeningnr, String gebnaam, String wachtwoord, String rol) {
    super(voornaam, tussenvoegsel, achternaam, woonplaats, geslacht, rekeningnr);
    this.gebnaam = gebnaam;
    this.wachtwoord = wachtwoord;
    this.rol = rol;
}

【问题讨论】:

    标签: java object inheritance arraylist


    【解决方案1】:

    您可以使用类型比较运算符:instanceof。它可以让您比较变量是否是类(或子类)的实例。

    请参阅以下示例,该示例遍历personen 列表,然后使用instanceof 来确定它是否实际上是Lid 的实例:

    List<Lid> lids = new ArrayList<>();
    for(Persoon persoon : personen){
        if(persoon instanceof Lid){
            // safe cast and add to lids
            lids.add((Lid) persoon);
        }
    }
    

    如果你碰巧使用 Java 8,你可以让我们使用新的 Stream API:

    List<Lid> lids = personen.stream() // create a stream of persoonen
        .filter(Lid.class::isInstance) // equivalent to using instanceof
        .map(Lid.class::cast)          // equivalent to casting
        .collect(Collectors.toList()); // creating a list
    

    【讨论】:

    • 天哪,你救了我一个大问题,非常感谢你快速而清晰的回答!当计时器允许我时,我会接受答案!
    【解决方案2】:

    正如我所见,您想将父对象添加到子类型的数组列表中。 因此,当您遍历 persoon 列表时,请使用 instanceOf 检查 persoon 的类型,然后将 case 输入到 Lid 并将其添加到您的新列表中。

    希望这能解决您的问题。

    更多增强解决方案如下。

    personen.stream().filter(p->p instanceOf Lid).map(p->(Lid)p).collect(Collectors.toList());
    

    通过使用 Java 8 的流 API,您可以在一行中完成。 谢谢!

    【讨论】:

    • 感谢您的宝贵时间!
    猜你喜欢
    • 1970-01-01
    • 2020-10-29
    • 2014-04-28
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多