簡體   English   中英

如何確定ArrayList迭代器接下來將返回的對象類型?

[英]How can I determine the type of object an ArrayList iterator will return next?

我有一個ArrayList ,我使用迭代器來運行它。 我需要找出下一個類型的對象:

Iterator vehicleIterator = vehicleArrayList.iterator();

while(vehicleIterator.hasNext())
{
     //How do I find the type of object in the arraylist at this point
     // for example, is it a car, bus etc... 
}

謝謝

Object o = vehicleIterator.next();
if (o instanceof Car) // Is a car
if (o instanceof Bus) // ...

首先,在那里獲得一些泛型。 它們自2004年以來一直在Java中。即使是引入它們的Java SE版本也已完成其服務終止期限。

(由於@finnw指出的,我忘記了可憐的Java ME的。如果你有使用Java ME,那么你就需要避開仿制葯和投(但不是instanceof經常),直到它(包括部署的設備),使得它成為2004年)

使用instanceof和cast 往往表明設計不佳。 最好將帶有接口的對象放入列表中,客戶端代碼可以在沒有測試的情況下使用該接口,以及映射到列表的每個“真實”目標的不同行為的實現。 “計算機科學中的每一個問題都可以通過添加另一個間接層來解決”[“......除了太多的間接層次。”]

一種方法是使用getClass()方法。

Object obj = vehicleIterator.next();
Class type = obj.getClass();  
System.out.println("The type is: " + type.getName());

但是,如果您明確檢查類類型,那么使用多態或其他OO原則編寫代碼幾乎總是更好的方法。 如果添加其他類型的汽車,則必須更改像這樣檢查類型或使用instanceof代碼。

如果沒有關於你正在使用該類型做什么的更多信息,我建議你有一個基本類型的VehicleCarBus等都繼承。 為您的車輛提供他們需要的方法(覆蓋您需要的方法),然后在循環中調用這些方法。

由於您需要下一個元素的類而不是當前元素的類,因此請考慮使用peeking迭代器實現。

然后你可以使用循環條件,如:

while (vehicleIterator.hasNext() &&
       ForkLiftTruck.class.isAssignableFrom(vehicleIterator.peek().getClass())) {
    vehicle forkLiftTruck = (ForkLiftTruck) vehicleIterator.next();
    // ...
}

你總是可以使用getClass() ,以防你getClass()地想要預期。

泛型可以在這里提供很大的幫助。 然后,您可以使用instanceof來確定Car of Bus。

暫無
暫無

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

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