我正在寫一個Java的方法,必須接收並遍歷Serializable
的List
。
有什麼區別:List <Serializable> vs List <?擴展Serializable>
public void myMethod(List<Serializable> list) {
}
和
public void myMethod(List<? extends Serializable> list) {
}
我正在寫一個Java的方法,必須接收並遍歷Serializable
的List
。
有什麼區別:List <Serializable> vs List <?擴展Serializable>
public void myMethod(List<Serializable> list) {
}
和
public void myMethod(List<? extends Serializable> list) {
}
在第一種情況下,給予方法列表必須是List<Serializable>
。在第二種情況下,它可以是,或者List<AnythingThatDerivesFromSerializable>
。 (在Serializable
特定情況下,它不可能有太大差別。)
讓我們做,一般情況下:
class Base {
}
class Sub extends Base {
}
然後
public void myMethod(List<Base> list) {
}
如果我有一個List<Sub>
,我不能不要給myMethod
。但如果你這樣做:
public void myMethod(List<? extends Base> list) {
}
我可以。
List<Serializable> list
表示您只能發送List<Serializable>
參數或實現List<Serializable>
的類,如ArrayList<Serializable>
。
List<? extends Serializable> list
表示只要Whatever
實現了Serializable
接口,例如,您可以發送List<Whatever>
。 List<String>
。
List<? extends Serializable>
將允許來電者通過任何亞型的Serializable
列表。這通常比需要精確類型匹配更靈活。
但是,請注意,使用擴展通配符List<E>
將限制您可以執行的操作。具體而言,您將無法調用具有包含有界泛型參數的參數類型的任何實例方法。例如,您不能撥打list.add(E)
,因爲它有一個參數類型E
(以通配符爲界),但您可以撥打get(int)
。
拇指用於與收藏的規則擴大通配符的是,你可以拉值從集合中,但你不能把價值在。如果你只是從列表中讀取數據,那麼你應該使用通配符。