Swift 的 "implicitly unwrapped optionals" 与 Java 的 "autoboxing" 有何不同?

How is Swift's "implicitly unwrapped optionals" different from Java's "autoboxing" of integers?

Swift的“隐式解包选项”的想法与Java的“自动装箱" 的整数?如果将 xObj 声明为 "implicitly unwrapped option":

,则以下运行时异常仅可能出现在 Swift 中
Integer xObj = new Integer(-1);  
xObj = null;  // could do this with an implicitly unwrapped optional as well.
Integer.valueOf(xObj); // <-- exception. Integer.valueOf(int x); couldn't deal with this.

关键是 "implicitly unwrapped optionals" 可以是 nil,但你最好小心,不要在预期非 nil 引用时使用它们,对吗?

Is the idea of Swift's "implicitly unwrapped optionals" the same as Java's "autoboxing" of integers?

一样?不,这是一个过于强烈的声明。 在某些情况下有类似的目的吗?是的。

在 Java 中使用自动装箱有两个主要原因:

  1. 将值类型(基元)转换为对象,以便它们可以存储在集合中,例如 ArrayListHashMap

    • 唯一需要这种处理的图元是 byteshortintlongfloatdoubleboolean,以及 char。因此,为什么这些是唯一具有自动装箱对象等价物的类型。 Java 自动装箱仅限于这些类型,而在 Swift 中,可选项适用于所有类型。
    • Swift的原生集合可以存储值类型,因此不需要这种转换。
    • Foundation 的集合只能存储指针。使用它们时,Swift 通过自动将数字类型装箱到 NSNumber 对象中来做与 Java 类似的事情。
    • Swift的Optional是一个枚举,是一个值类型,不管它包装的是引用类型还是值类型。
  2. 允许在不使用标记值的情况下为空。 IE。返回 null 而不是 -1Integer.MIN

    • 这就是 Swift 的可选选项的用途。