![](/img/trans.png)
[英]How to access private fields in superclass from a subclass without using setters?
[英]How to access subclass fields at runtime using superclass instance
我有兩個java對象: WorkflowVo
和TypeAWorkflowVo
。 TypeAWorkflowVo
是WorkflowVo
的子類。 WorkflowVo具有字段-名稱,profitCenter。 TypeAWorkflowVo具有計划,實體字段。
我使用以下命令將TypeAWorkflowVo
存儲在列表中
List<? extends WorkflowVo> lsWfItems = new ArrayList<TypeAWorkflowVo>();
是否可以在運行時從lsWfItems
訪問TypeAWorkflowVo
(計划,實體)的字段?
我只能在運行時看到WorkflowVo
字段(名稱,profitcenter)。 換句話說,我只在lsWfItems
看到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.