当您将非参数化类型(Object)转换为参数化类型(LinkedList)时,Java 会这样抱怨。它是告诉你它可以是任何东西。这与第一个演员并没有什么不同,除了第一个演员不是那种类型时会生成 ClassCastException 而第二个不会。
这一切都归结为类型擦除。运行时的 LinkedList 实际上只是一个 LinkedList。您可以在其中放入任何内容,它不会像第一个示例那样生成 ClassCastException。
通常要摆脱此警告,您必须执行以下操作:
@SuppressWarning("unchecked")
public List<Something> getAll() {
return getSqlMapClient.queryForList("queryname");
}
其中 queryForList() 返回一个列表(非参数化),您知道其中的内容将属于 Something 类。
另一方面,Java 中的数组是协变的,这意味着它们保留运行时类型信息。例如:
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");
是完全合法的。