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

时间:2014-03-05 16:19:57

标签: 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);

1 个答案:

答案 0 :(得分: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);
    }
}

请注意如何在没有异常的情况下调用构造函数本身 - 它无法知道您实际尝试构造的列表类型,因此它不会执行任何强制转换。但是,当您获取某个值时,会隐式转换为String并获得ClassCastException