代码之家  ›  专栏  ›  技术社区  ›  MrEmper

用抽象对象转换ArrayList

  •  1
  • MrEmper  · 技术社区  · 6 年前

    早上好,大家好,

    在写图形用户界面时,我遇到了数组列表的问题。 在我的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;
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Lino    6 年前

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

    请参见下面的示例 personen 列出然后使用 运算符 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,您可以使我们获得新的流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
  •  1
  •   user2026076    6 年前

    如我所见,您希望将父对象添加到子类型的数组列表中。 因此,当您在遍历Persoon列表时,请使用 实例 然后在LID中键入case that并将其添加到新列表中。

    希望这能解决你的问题。

    更多增强解决方案可以如下所示。

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

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