簡體   English   中英

如何在運行時使用超類實例訪問子類字段

[英]How to access subclass fields at runtime using superclass instance

我有兩個java對象: WorkflowVoTypeAWorkflowVo TypeAWorkflowVoWorkflowVo的子類。 WorkflowVo具有字段-名稱,profitCenter。 TypeAWorkflowVo具有計划,實體字段。

我使用以下命令將TypeAWorkflowVo存儲在列表中

List<? extends WorkflowVo> lsWfItems  = new ArrayList<TypeAWorkflowVo>();

是否可以在運行時從lsWfItems訪問TypeAWorkflowVo (計划,實體)的字段?

我只能在運行時看到WorkflowVo字段(名稱,profitcenter)。 換句話說,我只在lsWfItems看到WorkflowVo對象。 請指教。

您當前編寫的方式不起作用。 您確實有幾種選擇

  1. 檢查每個項目的類型是否為TypeAWorkflowVo,然后將其強制轉換為此類並檢索值
  2. 使用TypeAWorkflowVo的type參數制作列表
  3. 使TypeAWorkflowVo上的字段可通過WorkflowVo上的通用抽象方法訪問
  4. 將字段移到WorkflowVo

這些都各有優缺點,而決定將完全取決於情況和該對象的定義。 這些字段是否應屬於超類? 該列表是子類還是超類。 您從應用程序中的每種方法中獲得了什么? 所有這些都將通過應用程序得到解答

我使用以下命令將TypeAWorkflowVo存儲在列表中

List<? extends WorkflowVo> lsWfItems  = new ArrayList<TypeAWorkflowVo>();

這不可能。

<? extends SomeThing> <? extends SomeThing>不允許在Collection中添加任何內容,但可以為null

如果希望能夠在List添加WorkflowVo實例,則應該聲明此方法:

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

是否可以在運行時從lsWfItems訪問TypeAWorkflowVo(計划,實體)的字段?

當您聲明List<? extends WorkflowVo> lsWfItems List<? extends WorkflowVo> lsWfItems ,則應TypeAWorkflowVo轉換為TypeAWorkflowVo以使用其指定方法。
例如 :

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

現在,您可以避免轉換,這樣會更好。
理想情況下,如果您在List僅存儲TypeAWorkflowVo實例,請聲明:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM