为什么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?
如适用。
- Android Plugin 2.2.0-alpha1无法与Kotlin编译
- 为什么在Android Studio中重新启动后用Kotlin编写的界面消失了?
- 'when'语句跳过Kotlin for Android的条件
- Android Studio 3.0在重建之后重复压缩输入警告
- 我必须重新启动IDE才能运行测试
- 使用C ++支持时,Android Studio调试器不起作用
- 如何在Kotlin中创建一个打开新的活动(Android Studio)的按钮?
- 为什么在Android Studio中重新启动后用Kotlin编写的界面消失了?
- Android Studio:即使在即时运行时按下运行应用程序,代码更改也不会反映出来