簡體   English   中英

如何使方法參數類型為ArrayList <Object> 采取不同的對象類型

[英]how to make method parameter type ArrayList<Object> take different object types

我有一個抽象方法作為抽象類的一部分,具有以下聲明:

abstract public ArrayList<Device> returnDevices(ArrayList<Object> scanResult);

我希望傳遞的參數是一個ArrayList,但ArrayList中的類型對象將依賴於繼承此超類並實現方法returnDevices的子類。

我認為我可以通過如上所述使方法抽象來實現這一點,然后在繼承它的子類中執行以下操作:

public ArrayList<Device> returnDevices(ArrayList<Object> scanResult) {

    Iterator<Object> results = scanResult.iterator();
    while(results.hasNext())
        Packet pkt = (Packet) results.next();  // HERE: I cast the Object
}

這很好,不會導致錯誤,但是當我嘗試使用ArrayList<Packet>類型的參數調用returnDevices時,如下所示:

ArrayList<Packet> packets = new ArrayList<Packet>();
// <----- the "packets" ArrayList is filled here
ArrayList<Device> devices = returnDevices(packets);

......我收到錯誤:

The method returnDevices(ArrayList<Object>) in the type ScanResultParser is not applicable for the arguments (ArrayList<Packet>)

很明顯它拒絕參數類型。 實現我想做的事情的正確方法是什么?

-這就是如何在Java中對Collections進行類型安全處理 ,因此錯誤的類型不會進入集合 ,因為集合`Compilation時”和“ Runtime期間進行檢查,即Cat對象不應進入類型狗的集合。

你可以這樣做......

public ArrayList<Device> returnDevices(ArrayList<? extends Object> scanResult)

要么

public <T extends Object> ArrayList<Device> returnDevices(ArrayList<T> scanResult)

問題是,即使Packet是一個ObjectArrayList<Packet>也不是ArrayList<Object> 通用類型在Java中是不變的

您可以將extendssuper關鍵字與您的類型參數一起使用,以在Java泛型中引入該類型的效果。

我認為以下是應該的

abstract public <T extends Device> List<T> returnDevices(List<T> scanResult);

隨着與任一方法采取的列表Device S和返回ALIST Device S或采取的一些亞型的列表Device並返回相同亞型的列表。


旁注:針對某些具體類型(例如ArrayList )進行編碼不是一個好習慣。 您應該盡可能對接口進行編碼(例如List )。

暫無
暫無

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

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