如何使用超类实例在运行时访问子类字段

时间:2017-08-02 20:00:40

标签: java inheritance

我有两个java对象:WorkflowVoTypeAWorkflowVoTypeAWorkflowVoWorkflowVo的子类。 WorkflowVo有字段 - 名称,利润中心。 TypeAWorkflowVo有字段schedule,entity。

我使用

TypeAWorkflowVo存储在列表中
List<? extends WorkflowVo> lsWfItems  = new ArrayList<TypeAWorkflowVo>();

是否可以在运行时从TypeAWorkflowVo访问lsWfItems(计划,实体)的字段?

我只能在运行时看到WorkflowVo个字段(名称,利润中心)。换句话说,我只在WorkflowVo中看到lsWfItems个对象。请指教。

2 个答案:

答案 0 :(得分:1)

您目前所写的方式无效。你有几个选择

  1. 检查每个项目是否为TypeAWorkflowVo类型,然后转换为此类并检索值
  2. 使用TypeAWorkflowVo
  3. 的类型参数创建列表
  4. 可以通过WorkflowVo上的通用抽象方法访问TypeAWorkflowVo上的字段
  5. 将字段移至WorkflowVo
  6. 其中每一项都有其优点而且失败,决定将完全取决于该对象的情况和定义。这些领域应该在超级班吗?该列表应该是子类还是超类。您从应用程序中的每个方法中获得了什么?所有这些都将从应用程序中回答

答案 1 :(得分:0)

  

我使用

将TypeAWorkflowVo存储在列表中
List<? extends WorkflowVo> lsWfItems  = new ArrayList<TypeAWorkflowVo>();

这是不可能的。

<? extends SomeThing>不允许在集合中添加任何内容,但null

如果您希望能够在WorkflowVo中添加List个实例,则应该声明这一点:

List<WorkflowVo> lsWfItems = new ArrayList<WorkflowVo>();
  

是否可以访问TypeAWorkflowVo的字段(schedule,   实体)来自运行时的lsWfItems?

当您声明List<? extends WorkflowVo> lsWfItems时,您应该对TypeAWorkflowVo进行投射以使用它的指定方法。
例如:

for (WorkflowVo workFlow : lsWfItems){
   if (workFlow instanceof TypeAWorkflowVo){
       TypeAWorkflowVo typeWorkFlow = (TypeAWorkflowVo) workFlow;
       ...
   }
}

现在,你可以避免施法,这会更好 理想情况下,如果您只在TypeAWorkflowVo中存储List个实例,请声明:

List<TypeAWorkflowVo> lsWfItems = new ArrayList<TypeAWorkflowVo>();