为什么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?
如适用。
- 添加一个Fragment后,Android工作室分解了我的build.gradle文件
- 如何在Android Studio中将Kotlin错误链接到源代码?
- Android从Gradle和Kotlin的各种错误
- Gradle和Realm库的编译问题
- Android工作室插件ID:'kotlin-android-extensions'
- “对于超类型的Kotlin Android Studio的直接争论,不允许有预测
- 使用C ++支持时,Android Studio调试器不起作用
- Kotlin未解决的引用linkedListOf
- Android Studio gradle项目(不是android项目),同步使gradle库丢失