这种原始类型分配是否类型安全? List = new ArrayList();

我有一些像这样的代码:

@SuppressWarnings({"unchecked", "rawtypes"}) List theList = new ArrayList(); 

这种类型安全吗? 我认为这是安全的,因为我没有将原始类型分配给其他任何东西。 我甚至可以certificate它在调用add时执行类型检查:

 theList.add(601); // compilation error 

我读过“什么是原始类型,我们为什么不使用它?” 但我不认为这适用于此,因为我只使用原始类型创建列表。 之后,我将其分配给参数化类型,那么可能出现什么问题?

还有,这个怎么样?

 @SuppressWarnings({"unchecked", "rawtypes"}) List anotherList = new ArrayList(theList); 

第一个是类型安全的,因为列表是空的,但仍然没有建议。 在这里使用原始类型没有任何好处 。 最好设计远离警告而不是压制它。

第二个绝对不是类型安全的,因为theList可能是List ,例如:

 import java.util.*; public class Test { public static void main(String[] args) throws Exception { List integers = new ArrayList<>(); integers.add(0); List strings = new ArrayList(integers); // Bang! String x = strings.get(0); } } 

注意如何在没有exception的情况下调用构造函数本身 – 它无法知道你真正想要构造什么类型的列表,因此它不会执行任何强制转换。 但是,当您获取一个值时,会隐式转换为String并获得ClassCastException