java - 这个原始类型赋值类型安全吗?列表<T> = new ArrayList();

标签 java generics type-safety raw-types

我有这样的代码:

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

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

theList.add(601); // compilation error

我已阅读 "What is a raw type and why shouldn't we use it?"但我认为它在这里不适用,因为我只创建具有原始类型的列表。之后,我将其分配给参数化类型,那么会出什么问题呢?

还有,这个呢?

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

最佳答案

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

第二个绝对不是类型安全的,因为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);
    }
}

请注意构造函数本身是如何无一异常(exception)地被调用的——它无法知道您真正试图构造的列表类型,因此它不执行任何转换。但是,当您随后获取 一个值时,它会隐式转换为 String你会得到一个 ClassCastException .

关于java - 这个原始类型赋值类型安全吗?列表<T> = new ArrayList();,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22203257/

相关文章:

java - 具有通用返回类型的 vararg 方法中的 @SafeVarargs

java - Eclipse 中的源代码兼容性设置

c# - 将项目添加到通用列表时出现问题

java - 如何删除自定义链表中的所有节点?

java - 将模型类添加到通用列表会引发错误

java - Guice 注入(inject)通用类型

casting - F# 转换一个 int

C++11 检查两组可变参数模板参数是否匹配

java - m2e: 包含 java _sources_ 的文件夹需要被多个 m2e 项目使用

java - 对象数组 OutOfBoundsException