我有一個ArrayList<Item> items
和兩個繼承Item
的類,它們是Book
和DVD
。我想補充一些書籍和DVD的一些項目列表中的只從一個ArrayList獲取子類項目
items.add(new Book());
items.add(new DVD());
現在我想做一個
public void printAllBooks()
{
}
我怎麼能隨便挑了Item
這是子類Book
只打印?
我有一個ArrayList<Item> items
和兩個繼承Item
的類,它們是Book
和DVD
。我想補充一些書籍和DVD的一些項目列表中的只從一個ArrayList獲取子類項目
items.add(new Book());
items.add(new DVD());
現在我想做一個
public void printAllBooks()
{
}
我怎麼能隨便挑了Item
這是子類Book
只打印?
一個快速的解決方案是使用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);
如果你被迫使用組合的列表,你可以使用instanceof
檢查,如果它是一本書..
public void printAllBooks()
{
for(Item i : items){
if(i instanceof Book){
System.out.println(i);
}
}
}
但更好的設計可能是有書單獨列表和DVD
記得我會b e只讀 – prsutar 2014-11-24 18:25:30
for (Item item : items) {
if (item instanceof Book) {
System.out.println(item);
}
}
下面是解
public void printAllBooks(){
for(Object item: Items)
if(item instanceOf Book)
//do what ever you want
}
你可以這樣做:
for(Item item : items) {
if(item instanceof Book) {
// do something with Book Item
}
}
如果你使用的番石榴,你可以使用以下命令:
對於你的榜樣,像這樣的工作:
Iterable<DVD> dvds = Iterables.filter(items,DVD.class);
你是什麼意思:「檢查該項目是否可以從該類型分配」? – 2014-11-24 18:22:09
@Panayiotis我加了一個例子。更正:「檢查類型是否可以從項目類型中分配」(即相反,但想法相同)。 – manouti 2014-11-24 18:28:24