2012-10-29 29 views
2

我用如下聲明一個抽象類的部分抽象方法:如何使方法參數類型的ArrayList <Object>採取不同的對象類型

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>) 

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

+0

閱讀[泛型和通配符](http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html)和[通用方法](http://docs.oracle.com/javase /tutorial/extra/generics/methods.html) – Sujay

+0

不存在問題的上下文:使用「列表」作爲類型而不是具體實現。從來沒有理由使用ArrayList作爲參數/返回值,並且它使代碼更加靈活 –

回答

9

-這是Collections如何型薩法德在Java中所以錯誤類型不進入收藏,由於收集的`Compilation時檢查只期間進行Runtime ..即Cat對象不應該進入Dog類型的集合。

你能做到這樣...

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

或者

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

+0

感謝萌芽,這正是我所需要的! – gnychis

+0

@gnychis您好,歡迎好友....... –

1

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

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

我認爲下面是它應該是什麼

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

有與任取的Device秒的列表,並返回的Device小號ALIST或採取Device一些亞型的列表,並返回一個方法相同子類型的列表。


附註:針對某種具體類型(例如ArrayList)的編碼不是一種好的做法。只要可能,您應該始終在接口上編寫代碼(例如List)。

相關問題