是否有某种方法可以从包含不同对象的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)
仍然,同样的结果。
答案 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
方法声明一个接口,并同时实现Furniture
和Resident
。
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());
}