为什么Android Studio将一些原始Kotlin类型转换为条件/安全运算符?

我知道我不应该在这里问“为什么”的问题,但我希望这是一个允许的例外,因为它是一个代码相关的问题。 我只是不知道这个新语言的后果。

我正在使用Android studio 3.0 canary 3,并将java代码转换为Kotlin。 很多代码是手动转换的,但是我通过复制/粘贴java将其转换为新的Kotlin文件。

到现在为止还挺好。 但是,我开始注意到这一点:

Java代码:

class MyClass { private String userId; private Long newFolderId; private int oldFolderId; public MyClass(final String userId, final Long newFolderId, final int oldFolderId) { this.userId = userId; this.newFolderId = newFolderId; this.oldFolderId = oldFolderId; } } 

我将这一小块代码复制到Kotlin,并自动转换为:

 class MyClass(private val userId: String, private val newFolderId: Long?, private val oldFolderId: Int) 

所以,我现在的问题是为什么Long变成Long?

如果这是安全的,那么不应该是所有的变量? ? 像, String?Int?

为什么只是Long

另外,我知道我为这个课程过了很长时间,所以只是删除这个课程会不好? 从龙,只是叫它Long

谢谢你的帮助。

问题是为什么Kotlin将原始Kotlin类型转换为可空类型?

首先 – Kotlin没有原始类型 – 它只能在JVM上优化一些基本的类型表示。 Kotlin基本类型

其次 – 在这里需要注意的是,您正在将Java代码转换为Kotlin。 所以你的Java代码和它的类型是在转换上有差别的。

在Java中, Long是类,而不是原始类型。 在Java中, long是与Long相对的原始对象。

所以你的Long参数在Java中可以为null,并且被正确地转换为可空的Long? 你的int参数是Java中的原始类型 – 它不能为空 – 它被转换为不可为空的Int

如果你有不同的Java类声明

 class MyClass { private String userId; private long newFolderId; private int oldFolderId; public MyClass(final String userId, final long newFolderId, final int oldFolderId) { this.userId = userId; this.newFolderId = newFolderId; this.oldFolderId = oldFolderId; } } 

它会被转换为

 internal inner class MyClass(private val userId: String, private val newFolderId: Long, private val oldFolderId: Int) 

正如你所看到的,原始的long被转换为不可空的Long


为什么非原始String类型转换为不可空?

问题的这一部分是基于意见的,或者至少是答案。

由于其性质, String可能有特殊的处理 – 空字符串可以用作默认值。 在许多语言中,字符串有特殊的处理和考虑。 大多数情况下,你更喜欢String变量不能为空。 由于Kotlin强调无效安全性,因此默认代码转换将String视为非空值是合乎逻辑的。


就零安全而言。 当你可以使用非空类型时,每一段代码比使用可空类型的代码更安全和简单。 那么Long是宁愿Long? 如适用。