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

Rad*_*def 4 java generics raw-types type-safety

我有一些像这样的代码:

@SuppressWarnings({"unchecked", "rawtypes"})
List<String> theList = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

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

theList.add(601); // compilation error
Run Code Online (Sandbox Code Playgroud)

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

还有,这个怎么样?

@SuppressWarnings({"unchecked", "rawtypes"})
List<String> anotherList = new ArrayList(theList);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 10

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

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

import java.util.*;

public class Test {

    public static void main(String[] args) throws Exception {
        List<Integer> integers = new ArrayList<>();
        integers.add(0);

        List<String> strings = new ArrayList(integers);
        // Bang!
        String x = strings.get(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

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