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

为什么有些语言需要装箱和拆箱?

丁和歌
2023-03-14
问题内容

这不是什么是装箱和拆箱的问题,而是 为什么 Java和C#之类的语言需要这样做?

我对C ++,STL和Boost非常熟悉。

在C ++中,我可以很容易地编写这样的内容,

std::vector<double> dummy;

我对Java有一定的经验,但是我真的很惊讶,因为我不得不写这样的东西,

ArrayList<Double> dummy = new ArrayList<Double>();

我的问题是,为什么它应该是一个对象,在谈到泛型时在技术上很难包含原始类型?


问题答案:

在谈到泛型时,从技术上讲很难包括原始类型吗?

在Java的情况下,这是因为泛型的工作方式。在Java中,泛型是一种编译时技巧,可防止您将Image对象放入ArrayList<String>。但是,Java的泛型是通过类型擦除实现的:泛型类型信息在运行时会丢失。这是出于兼容性的原因,因为泛型是在Java生命后期才添加的。这意味着,在运行时,an
ArrayList<String>实际上是一个ArrayList<Object>(或更好的:只是ArrayList期望并返回Object其所有方法)String在检索值时自动转换为。

但是由于int不是从派生的Object,所以您不能将其放在期望的ArrayList中(在运行时)Object,也不能将强制Object转换int为。这意味着int必须将原语包装为确实继承自的类型Object,例如Integer

例如,C#的工作原理有所不同。C#中的泛型也会在运行时强制执行,并且不需要装箱List<int>。仅当您尝试将值类型存储int在引用类型变量(如)中时,C#中的装箱操作才会发生object。由于int在C#中是从C#继承而来的Object,因此编写object obj = 2是完全有效的,但是int将被装箱,这是由编译器自动完成的(没有Integer引用类型暴露给html" target="_blank">用户或其他任何对象)。



 类似资料:
  • 问题内容: 我正在寻找一个清晰,简洁和准确的答案。 理想情况下,作为实际答案,尽管欢迎提供指向良好解释的链接。 问题答案: 装箱的值是对原始类型*进行最小包装的数据结构。装箱的值通常存储为指向堆上对象的指针。 因此,盒装值使用更多的内存,并且至少要进行两次内存查找才能访问:一次获取指针,另一次跟随该指针到达原语。显然,这不是您想要在内部循环中执行的操作。另一方面,带框值通常会与系统中的其他类型一起

  • 本文向大家介绍C#中什么是装箱和拆箱?相关面试题,主要包含被问及C#中什么是装箱和拆箱?时的应答技巧和注意事项,需要的朋友参考一下 答: 装箱:把值类型转换成引用类型 拆箱:把引用类型转换成值类型 装箱:对值类型在堆中分配一个对象实例,并将该值复制到新的对象中。 (1)第一步:新分配托管堆内存(大小为值类型实例大小加上一个方法表指针。 (2)第二步:将值类型的实例字段拷贝到新分配的内存中。 (3)

  • 本文向大家介绍什么是装箱(boxing)和拆箱(unboxing)? (*)相关面试题,主要包含被问及什么是装箱(boxing)和拆箱(unboxing)? (*)时的应答技巧和注意事项,需要的朋友参考一下 Object是引用类型,但是它的子类Int32竟然不能去Object能去的“要求必须是引用类型” 的地方,违反了继承的原则,所以需要把Int32装在Object中才能传递。 装箱:从值类型接口

  • 问题内容: 自动装箱是Java编译器在原始类型及其对应的对象包装器类之间进行的自动转换。例如,将int转换为Integer,将double转换为Double,依此类推。如果转换结果相反,则称为拆箱。 那么,为什么我们需要它?为什么要在Java中使用自动装箱和拆箱呢? 问题答案: 需要一些上下文来充分理解其背后的主要原因。 基元与类 Java中的原始变量包含值(整数,双精度浮点二进制数等)。由于这些

  • 本文向大家介绍自动装箱和拆箱?相关面试题,主要包含被问及自动装箱和拆箱?时的应答技巧和注意事项,需要的朋友参考一下 自动装箱是Java 编译器在基本数据类型和对应的对象包装类型之间做的一个转化。 比如:把int转化成 Integer,double转化成 Double,等等。反之就是自动拆箱。 原始类型: boolean,char,byte,short,int,long,float,double 

  • 主要内容:装箱和拆箱,包装类的应用在 Java 的设计中提倡一种思想,即一切皆对象。但是从数据类型的划分中,我们知道 Java 中的数据类型分为基本数据类型和引用数据类型,但是基本数据类型怎么能够称为对象呢?于是 Java 为每种基本数据类型分别设计了对应的类,称之为 包装类(Wrapper Classes),也有地方称为外覆类或数据类型类。 包装类和基本数据类型的关系如下表所示。 基本数据类型及对应的包装类 序号 基本数据类型