[英]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
代碼。
如果沒有關於你正在使用該類型做什么的更多信息,我建議你有一個基本類型的Vehicle
, Car
, Bus
等都繼承。 為您的車輛提供他們需要的方法(覆蓋您需要的方法),然后在循環中調用這些方法。
由於您需要下一個元素的類而不是當前元素的類,因此請考慮使用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.