用Java从ArrayList打印不同的对象数据

时间:2018-07-27 08:20:18

标签: java list generics arraylist

是否有某种方法可以从包含不同对象的ArrayList打印不同数据? 例如,我创建了两个基本类:

import java.util.*;

class Furniture{
    String name;
    int weight;

    Furniture(String name, int weight){
        this.name = name;
        this.weight = weight;
    }

    String getName(){
        return name;
    }
    int getWeight(){
        return weight;
    }
    }
}
class Resident{
    String name;

    Resident(String name){
        this.name = name;
    }

    String getName(){
        return name;
    }
}

然后我将它们存储在ArrayList<Object>中,并希望通过使用printArrayList下面声明的方法来打印名称:

public class Main{

public static <E> void printArrayList(ArrayList<E> arrayToPrint){
    for(E element : arrayToPrint){
        try{
            System.out.println(element.getName());
        }
        catch(Exception e){
            System.out.println("Exception e: " + e);
        }
    }
}

 public static void main(String []args){
    Furniture sofa = new Furniture("Sofa", 5);
    Resident mike = new Resident("Mike");

    ArrayList<Object> arrayList = new ArrayList<>();

    arrayList.add(sofa);
    arrayList.add(mike);
    printArrayList(arrayList);
}

现在,我知道并非所有对象都可以具有变量名或声明的get方法,因此我尝试通过try / catch排除这些情况。 我还尝试通过使用fe排除它:

if(elements.getName() == null)

仍然,同样的结果。

2 个答案:

答案 0 :(得分:4)

您不需要使用参数化类型。而是引入一个特定的接口(例如NameAware),该接口公开类使用的getName()方法。这样,您就可以依靠一个通用类型。

public interface NameAware{
   String getName();
}

public class Resident implements NameAware{
     ...
     public String getName(){
        return name;
    }
}

public class Furniture implements NameAware{
     ...
     public String getName(){
        return name;
    }
}

并将您的方法定义为:

public static void printArrayList(ArrayList<NameAware> arrayToPrint) {
    for (NameAware element : arrayToPrint) {
        try {
            System.out.println(element.getName());
        } catch (Exception e) {
            System.out.println("Exception e: " + e);
        }
    }
}

请注意,您应该从更改实际代码:

ArrayList<Object> arrayList = new ArrayList<>();

ArrayList<NameAware> arrayList = new ArrayList<>();

答案 1 :(得分:2)

最佳做法是使用getName方法声明一个接口,并同时实现FurnitureResident

public interface Namable {
    public String getName();
}

然后,使用List<Namable>代替List<Object>

Furniture sofa = new Furniture("Sofa", 5);
Resident mike = new Resident("Mike");

List<Namable> arrayList = new ArrayList<>();

arrayList.add(sofa);
arrayList.add(mike);

for (Namable n : arrayList) {
    System.out.println(n.getName());
}