簡體   English   中英

從父類列表中提取子類元素

[英]Extract subclass elements from List of parent class

我目前有一個像這樣的清單:

List<Parent> parentList = new Arraylist<>;
//Code inserts elements of subclassA and subclass B into parentList above

現在,我想從parentList中提取屬於子類A的元素。我想執行以下操作,但沒有錯誤:

List<SubclassA> extractMe = new Arraylist<>;
for (Parent parent: parentList){
    if (parent.isSubclassA()){extractMe.add(parent);}
}

我不確定該怎么做。 我不斷收到錯誤,因為我將可能是錯誤的對象類型/類添加到列表中,我理解為什么,但是我不知道如何更改代碼以使其正常工作。

編輯:

錯誤(我將類重命名為與上面使用的類匹配):

Error:(53, 20) java: no suitable method found for add(Parents.Parent)
        method java.util.Collection.add(Parents.SubclassA) is not applicable
          (argument mismatch; Parents.Parent cannot be converted to Parents.SubclassA)
        method java.util.List.add(Parents.SubclassA) is not applicable
          (argument mismatch; Parents.Parent cannot be converted to Parents.SubclassA)

Java中有一個名為instanceof的關鍵字,它將實例化的對象與類定義進行比較,以查看該對象是否屬於特定的類類型。

在您的示例中,可以在循環中使用instanceof關鍵字,然后將父對象強制轉換為子類並將其添加到列表中。

for(Parent parent : parentList)
{
    if(parent instanceof SubclassA)
    {
        SubclassA subclass = (SubclassA)parent;
        extractMe.add(subclass);
    }
}

需要將父對象轉換為子類(SubclassA)parent對象,因為即使可能已經檢查了parent對象為SubclassA類型, 編譯器仍然不知道 ,因此您必須明確告訴編譯器將parent對象轉換為SubclassA

另外請注意, instanceof關鍵字是java中的內置二進制運算符,它將根據您隨后指定的類檢查父級。 當您可以將parent SubclassASubclassASubclassA parent instanceof SubclassA 為true。 請參閱Oracle Docs示例

類型比較運算符instanceof

instanceof運算符將對象與指定類型進行比較。 您可以使用它來測試對象是實現特定接口的類的實例,子類的實例還是類的實例。

以下程序InstanceofDemo定義了一個父類(名為Parent),一個簡單接口(名為MyInterface)以及一個從父類繼承並實現該接口的子類(名為Child)。

 class InstanceofDemo { public static void main(String[] args) { Parent obj1 = new Parent(); Parent obj2 = new Child(); System.out.println("obj1 instanceof Parent: " + (obj1 instanceof Parent)); System.out.println("obj1 instanceof Child: " + (obj1 instanceof Child)); System.out.println("obj1 instanceof MyInterface: " + (obj1 instanceof MyInterface)); System.out.println("obj2 instanceof Parent: " + (obj2 instanceof Parent)); System.out.println("obj2 instanceof Child: " + (obj2 instanceof Child)); System.out.println("obj2 instanceof MyInterface: " + (obj2 instanceof MyInterface)); } } class Parent {} class Child extends Parent implements MyInterface {} interface MyInterface {} 

輸出:

 obj1 instanceof Parent: true obj1 instanceof Child: false obj1 instanceof MyInterface: false obj2 instanceof Parent: true obj2 instanceof Child: true obj2 instanceof MyInterface: true 

使用instanceof運算符時,請記住,null不是任何實例。

暫無
暫無

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

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