gpt4 book ai didi

Java泛型编程: Determining if class extends another

转载 作者:行者123 更新时间:2023-12-01 14:13:14 24 4
gpt4 key购买 nike

我有一些需要在 JTable 中显示的对象(航站楼、跑道、登机口、航空公司、工作人员等...)。我正在尝试构建一个适用于每个集合的 GenericTableModel (与 JTable 一起使用)。问题是其中一些对象具有数据结构,我不想显示这些结构。因此,我通过从集合中获取第一个对象并询问其声明的字段来获取列名称,这些字段不可从 AbstractMap 或 Collection 类分配。这似乎对我有用,到目前为止我只得到了我需要的字段。当我试图向 worker 展示时,问题就开始了。我有一个 W_Worker 抽象类,其中包含工作人员的大部分字段,并且我有不同的工作人员,例如 W_Manager、W_FuelWorker 等...每个子类只有 1 或 2 个字段,当我使用 GenericTableModel 将它们放入表中时,我仅从特定工作人员获取字段,而没有从 W_Worker 获取字段。

如何在方法的开头确定该类是否扩展了另一个类并使其首先获取这些字段?

如果这还不足以理解,我将提供代码。提前致谢,塔尔

编辑:添加代码。

public String[] getColumnName(Collection<T> collection){
Field fields[] = null;
String fieldsNames[];
ArrayList<String> desiredFields = new ArrayList<>();

for(Object o : collection){
fields = o.getClass().getDeclaredFields();
if (o instanceof W_Worker){
Field[] superFields = o.getClass().getSuperclass().getDeclaredFields();
Field[] result = new Field[superFields.length + fields.length];
System.arraycopy(superFields, 0, result, 0, superFields.length);
System.arraycopy(fields, 0, result, superFields.length, fields.length);
fields = result;
}
break;
}
fieldsNames = new String[fields.length];
for(int i = 0; i<fields.length ;i++){
if (!Collection.class.isAssignableFrom(fields[i].getType()) && !AbstractMap.class.isAssignableFrom(fields[i].getType())){
fieldsNames[i] = fields[i].getName();
}
}
for(String field : fieldsNames){
if (field != null){
desiredFields.add(field);
}
}
String newFields[] = new String[desiredFields.size()];
return desiredFields.toArray(newFields);
}

如您所见,我当前正在使用 instanceof,但这不够通用,因为它只能与 W_Worker 一起使用。

最佳答案

我会考虑 Visitor Pattern为了这。访问者会知道如何处理 TableModel。

有点像这样:

public class TableModelVisitor {

private TableModel model;

public void visit(Terminal terminal) {
terminal.accept(this);
}
public void visit(Runway runway) {
runway.accept(this);
}
public void visit(Worker worker) {
worker.accept(this);
}

//your methods to treat the model
}

然后您可以让每个节点与访问者打交道并要求它执行诸如填充模型之类的操作:

public class Worker {
public void accept(TableModelVisitor tableModelVisitor) {
//and here you know everything about your worker and its fields
//and have access to your visitor table model to configure it.
tableModelVistor.addField(this.getMyField1());
tableModelVistor.addField(this.getMyField2());
}
}

最后,您所要做的就是创建一个 TableModelVisitor 并要求它填充您想要的任何模型。

TableModelVisitor visitor = new TableModelVisitor(myTableModel);
visitor.visit(anyOfMyObjects);

关于Java泛型编程: Determining if class extends another,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18319656/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com