2014-11-24 63 views
0

我有一個ArrayList<Item> items和兩個繼承Item的類,它們是BookDVD。我想補充一些書籍和DVD的一些項目列表中的只從一個ArrayList獲取子類項目

items.add(new Book()); 
items.add(new DVD()); 

現在我想做一個

public void printAllBooks() 
{ 
} 

我怎麼能隨便挑了Item這是子類Book只打印?

回答

1

一個快速的解決方案是使用instanceof

for(Item item : items) { 
    if(item instanceof Book) { 
     // print it 
    } 
} 

更基因RIC的解決方案是使該方法通用的,給它一個型參數和檢查,如果該項目類型是指定的類的(或它的一個子類):

public <T extends Item> void printItems(List<Item> items, Class<T> clazz) { 
    for(Item item : items) { 
     // Check if item is of the same type or a subtype of the specified class. 
     if(clazz.isAssignableFrom(item.getClass())) { 
      // print it 
     } 
    } 
} 

然後打印Book元素:

printItems(itemsList, Book.class); 

同樣地,對於DVD元素:

printItems(itemsList, DVD.class); 
+0

你是什麼意思:「檢查該項目是否可以從該類型分配」? – 2014-11-24 18:22:09

+0

@Panayiotis我加了一個例子。更正:「檢查類型是否可以從項目類型中分配」(即相反,但想法相同)。 – manouti 2014-11-24 18:28:24

5

如果你被迫使用組合的列表,你可以使用instanceof檢查,如果它是一本書..

public void printAllBooks() 
{ 
    for(Item i : items){ 
     if(i instanceof Book){ 
      System.out.println(i); 
     } 
    } 
} 

但更好的設計可能是有書單獨列表和DVD

+0

記得我會b e只讀 – prsutar 2014-11-24 18:25:30

3
for (Item item : items) { 
    if (item instanceof Book) { 
     System.out.println(item); 
    } 
} 
0

下面是解

public void printAllBooks(){ 
    for(Object item: Items) 
    if(item instanceOf Book) 
     //do what ever you want 
} 
0

你可以這樣做:

for(Item item : items) { 
    if(item instanceof Book) { 
     // do something with Book Item 
    } 
}