先讓我們看下這段代碼:
List<String> ls = new ArrayList<String>(); // 1 List<Object> lo = ls; // 2
第一行是合法,問題出現在第二行上,這里有個問題:List<String> 是 List<Object> 的子類嗎?或者說它倆是可以直接等價的嗎?,大多數人會回答說“當然了!”。
好的,我們先假設第二行沒問題,那我們再看看下面代碼:
lo.add(new Object()); // 3 : lo是指向Object的集合,那么向里面放“Object”實例,是允許的。 String s = ls.get(0); // 4: 如果第二行成立,那么此時ls也是指向了“Object集合”的,但是ls的聲明是“List<String>(指向String集合)”,那么此時ls取出來的是Object呢?還是String?
第三行中,我們向 lo 插入一個 Object實例。那這時候的 ls 就不再是僅持有String類型的List集合了。當我們從 ls 里面取出一個對象賦值給String s 時,java會給我們一個警告!
所以在上面提出的問題,我們的java是不允許的(即:第二行編譯時期就已經報錯了)。回答是NO.