我有这样的代码:
@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/