当前位置: 首页 > 面试题库 >

此原始类型分配类型安全吗?清单 = new ArrayList();

通鸿风
2023-03-14
问题内容

我有一些这样的代码:

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

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

theList.add(601); // compilation error

我读过“什么是原始类型,为什么我们不应该使用它?” 但我认为它不适用于这里,因为我仅使用原始类型 创建
列表。之后,我将其分配给参数化类型,那么可能会出错吗?

还有,那呢?

@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);
    }
}

请注意,构造函数本身是如何被无例外调用的-它无法让您知道您 实际上 试图构造的列表类型,因此它不执行任何强制转换。但是,当您随后 获取
值时,该值隐式转换为,String并获得ClassCastException



 类似资料:
  • 问题内容: Java中的原始数据类型是否像&线程安全的?我执行了以下代码,但有时无法看到500的预期结果。 在这里,并发500个线程将更新int变量。等待并发更新完成后的主线程输出值。 在这里找到类似的例子 问题答案: 不安全的三种方式: 并且甚至不保证会自动进行更新(您可能会看到来自不同线程的写入的一半) 内存模型不能保证您会看到一个线程在另一个线程中的最新更新,而没有某种额外的内存障碍 无论如

  • 问题内容: Eclipse在正在运行的项目中仅使用以下代码(在其中仅包含伪类和main方法)给我警告(标题中): 最后一行触发警告。我不确定我在这里做错了什么,或者实际上我在做什么。我是一名Java学生,正在研究一个可疑的教程,并且试图理解泛型。假设变量x不能说明类型安全性。我尝试将其强制转换为对象类型(我认为它没有任何作用,因为它已经存在了),并且不起作用。 我如何解决此警告? 问题答案: 您声

  • 在下面来自的语法中,泛型类型参数在实例化原始类型数组后用于类型转换,

  • 问题内容: 我很好奇Java的类和double的原始类型之间的性能差异是什么。因此,我创建了一个基准测试,发现类类型比原始类型慢3到7倍。(在本地计算机OSX上为3x,在ideone上为7x) 这是测试: http://ideone.com/fDizDu 那么为什么Double类型要慢得多呢?为什么还要实施它以允许数学运算符? 问题答案: 那么为什么Double类型要慢得多呢? 因为该值包装在需要

  • 这段代码给出了一个运行时错误: < li >为什么< code>b.get()不会触发运行时错误? < li >为什么只有当我试图获取class变量的类时才会出现运行时错误? 更准确地说:为什么编译器仅为第二个(导致异常)在字节码中插入指令?

  • 如果类型参数在创建期间传递了npt,则原始类型是泛型类或接口的对象。 以下示例将展示上述概念。 例子 (Example) 使用您选择的任何编辑器创建以下Java程序。 GenericsTester.java package com.wenjiangs; public class GenericsTester { public static void main(String[] args) {