2015-09-03 42 views
1

我想創建一個通用的方法,它接受下面格式的數字列表。我知道我應該可以將任何類添加到至少是一個數字(浮點數,整數,雙精度)的列表「o」中,但是我也應該能夠添加任何對象,因爲所有類都從對象中擴展。換句話說,對象是任何類的超類。所以我想知道,爲什麼我在o.add(p)這行上得到一個錯誤; ?通用方法寫入列表

public int checkType(List<? super Number> o) 
{ 
    Object p = new Object(); 
    //error 
    o.add(p); 
    return - 1; 
} 

我跟着從Difference between <? super T> and <? extends T> in Java這是公認的答案的解釋仿製藥。

+0

什麼是錯誤信息? –

+0

@kocko問題不是重複 – george

+0

@Ferdinand Nema見上面 – george

回答

2

類型參數List<? super Number> o指定可以保存Number的任何List都可以傳遞給它。可能是List<Object>,但也可能是List<Number>

因此,編譯器將允許您僅向其添加Number(或子類型)對象。

要測試,請使用以下參數調用您的方法。

checkType(new ArrayList<Object>()); // Works fine (and it can hold Object type). 
checkType(new ArrayList<Number>()); // Works fine (But it can NOT hold Object type). 

所以,當你看到一個List<? super Number>意味着你正嘗試將Number添加到列表(PECS的規則)。

+0

checkType(new ArrayList ());工作正常,但後來o.add(p);仍然不起作用! – george

+0

@george,這是PECS的全部...參數不僅限於'List '...但是'List '也......並且您不能將一個對象放入'List '中。所以編譯器錯誤... – Codebender

0

一個考慮因素?

List<Object> myObjectList = Arrays.asList(1, 2, new SuperObject(), 4, 5); 

的Java帶有一個工具類Arrays標準。