为什么我们在Java中使用自动装箱和拆箱?

user1968030:

自动装箱是Java编译器在原始类型及其对应的对象包装器类之间进行的自动转换。例如,将int转换为Integer,将double转换为Double,依此类推。如果转换过程相反,这称为拆箱。

那么,为什么我们需要它?为什么要在Java中使用自动装箱和拆箱呢?

Theodoros Chatzigiannakis:

需要一些上下文来充分理解其背后的主要原因。

基元与类

Java中的原始变量包含值(整数,双精度浮点二进制数等)。由于这些值可能具有不同的长度,因此包含它们的变量也可能具有不同的长度(考虑floatdouble)。

另一方面,类变量包含对实例的引用引用通常在许多语言中实现为指针(或与指针非常相似的东西)。这些东西通常具有相同的大小,而不管它们指的是(实例的大小ObjectStringInteger,等)。

类变量的此属性使它们包含的引用可以互换(一定程度上)。这使我们能够执行所谓的替换:广义上讲,是将特定类型的实例用作另一种相关类型的实例(例如,将a String用作Object)。

原始变量不能以相同的方式互换彼此之间也不能互换Object最明显的原因(但不是唯一原因)是它们的大小差异。这使得原始类型在这方面不方便,但是我们仍然需要使用该语言(由于主要归结为性能的原因)。

泛型和类型擦除

泛型类型是具有一个或多个类型参数类型(确切的数字称为泛型arity)。例如,通用类型定义 List<T>具有类型参数T,可以是Object(产生具体类型 List<Object>),StringList<String>),IntegerList<Integer>)等。

泛型类型比非泛型类型复杂得多。当他们被介绍到Java(首次发行)之后,为了避免到JVM根本变化,并与旧的二进制可能破坏兼容性,Java的创作者决定在最小侵入性的方式来实现泛型类型:所有的具体类型List<T>实际上,已被编译为(的二进制等效项)List<Object>(对于其他类型,边界可能不是Object,但您明白了)。通用Arity和类型参数信息在此过程中丢失,这就是为什么我们将其称为类型擦除

将两者放在一起

现在的问题是上述现实的结合:如果在所有情况下都List<T>变为List<Object>,则T必须始终是可以直接分配给的类型Object不允许其他任何事情。因为,正如我们之前所说,intfloat并且double不与互换Object,不能有一个List<int>List<float>List<double>(除非仿制药的显著更复杂的实现JVM中的存在)。

但是Java提供喜欢的类型IntegerFloat以及Double其在类实例包装这些原语,使他们有效地作为替代Object,从而使泛型类型与原语间接地工作,以及(因为你可以List<Integer>List<Float>List<Double>等)。

创建的过程Integer,从一个int,一个Floatfloat等,被称为拳击相反的称为拆箱因为每次使用原始语言都必须对原始语言进行装箱Object是很不方便的,所以在某些情况下,语言会自动执行此操作- 这称为autoboxing

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我们需要在C#中装箱和拆箱?

来自分类Dev

为什么整数自动装箱和拆箱对Java中的Arrays.asList不起作用?

来自分类Java

为什么自动装箱/拆箱在这里失败?

来自分类Java

java自动装箱/拆箱如何工作?

来自分类Java

Java自动装箱/拆箱工作

来自分类Java

为什么我们在Java中使用clone()方法?

来自分类Java

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

来自分类Java

为什么我们在休眠中使用@Embeddable

来自分类Dev

为什么我们在 python 类中使用 super()?

来自分类Javascript

为什么我们在jQuery中使用“({})”?

来自分类Dev

为什么我们在 Optaplanner 中使用 XStream 注释

来自分类Dev

为什么我们在AngularJS中使用$ rootScope。$ broadcast?

来自分类Dev

为什么我们在nodejs中使用导出?

来自分类Dev

为什么我们在Android中使用JSON?

来自分类Dev

为什么我们在JPA存储库中使用服务层和DAO

来自分类Dev

为什么我们在 matlab 代码中使用 inf 和 power

来自分类Dev

为什么我们在reactjs中使用node.js和babel

来自分类Dev

为什么我们在这个函数声明中使用 const 和 & ?

来自分类Dev

为什么我们在PHP中使用assert()和assert_options()?

来自分类Dev

为什么我们在GWT中使用ClientBundle和ImageResource?

来自分类Dev

为什么我们需要在两个选择中使用 () 和?

来自分类Dev

我们在哪里使用 BitSet,为什么要在 Java 中使用它?

来自分类Java

Java·带lambda的装箱和拆箱原始矩阵

来自分类Java

为什么我们在Java项目中使用rt.jar?

来自分类Java

为什么我们不应该在Java中使用受保护的静态

来自分类Java

为什么我们需要在Java中使用移位运算符?

来自分类Java

为什么我们在Java中使用接口引用类型?

来自分类Dev

为什么我们在Java中使用String docType?还告诉我他们的优势?

来自分类Java

谁将进行自动装箱/拆箱?

Related 相关文章

  1. 1

    为什么我们需要在C#中装箱和拆箱?

  2. 2

    为什么整数自动装箱和拆箱对Java中的Arrays.asList不起作用?

  3. 3

    为什么自动装箱/拆箱在这里失败?

  4. 4

    java自动装箱/拆箱如何工作?

  5. 5

    Java自动装箱/拆箱工作

  6. 6

    为什么我们在Java中使用clone()方法?

  7. 7

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

  8. 8

    为什么我们在休眠中使用@Embeddable

  9. 9

    为什么我们在 python 类中使用 super()?

  10. 10

    为什么我们在jQuery中使用“({})”?

  11. 11

    为什么我们在 Optaplanner 中使用 XStream 注释

  12. 12

    为什么我们在AngularJS中使用$ rootScope。$ broadcast?

  13. 13

    为什么我们在nodejs中使用导出?

  14. 14

    为什么我们在Android中使用JSON?

  15. 15

    为什么我们在JPA存储库中使用服务层和DAO

  16. 16

    为什么我们在 matlab 代码中使用 inf 和 power

  17. 17

    为什么我们在reactjs中使用node.js和babel

  18. 18

    为什么我们在这个函数声明中使用 const 和 & ?

  19. 19

    为什么我们在PHP中使用assert()和assert_options()?

  20. 20

    为什么我们在GWT中使用ClientBundle和ImageResource?

  21. 21

    为什么我们需要在两个选择中使用 () 和?

  22. 22

    我们在哪里使用 BitSet,为什么要在 Java 中使用它?

  23. 23

    Java·带lambda的装箱和拆箱原始矩阵

  24. 24

    为什么我们在Java项目中使用rt.jar?

  25. 25

    为什么我们不应该在Java中使用受保护的静态

  26. 26

    为什么我们需要在Java中使用移位运算符?

  27. 27

    为什么我们在Java中使用接口引用类型?

  28. 28

    为什么我们在Java中使用String docType?还告诉我他们的优势?

  29. 29

    谁将进行自动装箱/拆箱?

热门标签

归档