我正在Android Developer网站上关注tutorial。它在Java示例中使用Kotlin。我在堆栈溢出中发现了这个post,这是相当的,但是我不明白答案。
原始代码是:
// Defines the selection clause
private static final String SELECTION = Data.LOOKUP_KEY + " = ?";
// Defines the array to hold the search criteria
private String[] selectionArgs = { "" };
/*
* Defines a variable to contain the selection value. Once you
* have the Cursor from the Contacts table, and you've selected
* the desired row, move the row's LOOKUP_KEY value into this
* variable.
*/
private lateinit var lookupKey: String
我将其重写如下:
// Defines the selection clause
private static final String SELECTION = ContactsContract.Data.LOOKUP_KEY + " = ?";
// Defines the array to hold the search criteria
private String[] selectionArgs = { "" };
/*
* Defines a variable to contain the selection value. Once you
* have the Cursor from the Contacts table, and you've selected
* the desired row, move the row's LOOKUP_KEY value into this
* variable.
*/
private String lookupKey;
这个答案太简单了吗?还是对Java有更复杂的翻译?
答案 0 :(得分:4)
lateinit
只是变量的可空性。由于Java没有这种属性,因此您不能将lateinit
转换为Java。好吧,您可以强制使用其类型,但是将无法应用@NonNull
/ @Nullable
。
Lateinit和Lazy是Kotlin的重要主题,需要深入阅读和深入探讨。 希望您能继续学习。
答案是正确的:只需使用private String lookupKey;
,就可以了。
顺便说一句,lateinit
仅在字节码中创建一个if
条件,如果该条件为null,则会抛出该条件。您在Java中没有lateinit
,因此需要手工编写代码。这只是Kotlin与Java相比的另一个不错的功能。
答案 1 :(得分:1)
Kotlin中的lateinit var lookupKey
定义了一个没有直接设置值的属性。稍后将值设置为属性。
编译器会小心地添加断言,以确保在未初始化之前无法读取该值。
https://kotlinlang.org/docs/reference/properties.html#late-initialized-properties-and-variables
在lateinit
中,Kotlin具有很好的可空性。因此,您可以定义一个没有值的不可为空的变量,而不是使用可为空的变量和null检查。
https://kotlinlang.org/docs/reference/null-safety.html
Java代码版本与Kotlin版本不同-它错过了检查断言,并允许null
值