当您将非参数化类型(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");
是完全合法的。