當您將非參數化類型(Object)轉換爲參數化類型(LinkedList)時,Java會發出類似的抱怨。這是告訴你,它可能是任何東西。它與第一次投射真的沒什麼兩樣,除非第一次會產生一個ClassCastException,如果它不是那種類型,但第二次不會。
這一切歸結爲類型擦除。運行時的LinkedList實際上只是一個LinkedList。你可以放入任何東西,它不會像第一個例子那樣產生ClassCastException。
往往擺脫這種警告,你必須做的是這樣的:
@SuppressWarning("unchecked")
public List<Something> getAll() {
return getSqlMapClient.queryForList("queryname");
}
其中的queryForList()返回一個列表(非參數),你知道的內容將是類的東西。
對此的另一方面是Java中的數組是covariant,這意味着它們保留運行時類型信息。例如:
Integer ints[] = new Integer[10];
Object objs[] = ints;
objs[3] = "hello";
會拋出異常。但是:
List<Integer> ints = new ArrayList<Integer>(10);
List<Object> objs = (List<Object>)ints;
objs.add("hello");
是完全合法的。