我有以下代码片段:
val foo: String? = null
foo.run { println("foo") }
Run Code Online (Sandbox Code Playgroud)
我这里有一个可以为空的变量foo,实际上设置null为非安全.run()调用.
当我运行代码片段时,foo尽管run在a上调用了该方法,但我仍然打印出来null.这是为什么?为什么不NullPointerException呢?为什么编译器允许对可选值进行非安全调用?
如果我通过println(foo),我得到一个不错的多汁null的控制台,所以我认为它是安全的假设,foo实际上是null.
我有一个案例,其中Java to Kotlin转换器因为没有将方法参数标记为可空而使我失败.
示例:跟踪活动生命周期使用registerActivityLifecycleCallbacks:
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {}
@Override
public void onActivityStarted(Activity activity) {}
@Override
public void onActivityResumed(Activity activity) {}
// ... other overriden methods
});
Run Code Online (Sandbox Code Playgroud)
将此代码粘贴到Kotlin结果:
registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle) {}
override fun onActivityStarted(activity: Activity) {}
override fun onActivityResumed(activity: Activity) {}
override fun onActivityPaused(activity: Activity) {}
// ... other overriden methods (all with non-nullable parameters)
})
Run Code Online (Sandbox Code Playgroud)
问题是savedInstanceState参数类型Bundle应该是Bundle?它的位置,因为它的值可以是null …
java android kotlin kotlin-android-extensions kotlin-null-safety
如何测试KType变量是否包含可为空的kotlin类型的值(eG Int?)?
我有
var type: KType
Run Code Online (Sandbox Code Playgroud)
变量来自a KProperty<*>.returnType,我需要检测它是否等于某些kotlin类型(Int,Long等).这适用于:
when (type) {
Int::class.defaultType -> ...
Long::class.defaultType -> ...
else -> ...
}
Run Code Online (Sandbox Code Playgroud)
但这仅适用于非可空类型,因此第一个分支与Int不匹配?但是我还是无法弄清楚我是如何检测到的类型是Int?除了明显但不那么好
type.toString().equals("kotlin.Int?")
Run Code Online (Sandbox Code Playgroud) 在Kotlin中,此代码的语法是否更短:
if(swipeView == null){
swipeView = view.find<MeasureTypePieChart>(R.id.swipeableView)
}
Run Code Online (Sandbox Code Playgroud)
首先我试过这个:
swipeView ?: view.find<MeasureTypePieChart>(R.id.swipeableView)
Run Code Online (Sandbox Code Playgroud)
但后来我意识到这不是一个任务,所以代码什么都不做.然后我试过:
swipeView = swipeView ?: view.find<MeasureTypePieChart>(R.id.swipeableView)
Run Code Online (Sandbox Code Playgroud)
哪个有效,但有点冗长.我希望这样的事情:
swipeView ?= view.find<MeasureTypePieChart>
Run Code Online (Sandbox Code Playgroud)
但不幸的是,这不起作用.有没有办法用短语法完成这个?
我知道我可以这样做:
variable?.let { it = something } which works.
Run Code Online (Sandbox Code Playgroud) 由于Kotlin有非空的断言,我发现了一些有趣的东西......
val myvar: String = null!!
Run Code Online (Sandbox Code Playgroud)
它会崩溃.
但重点是,它不会在编译时检查.
该应用程序将在运行时崩溃.
它不应该抛出编译时错误吗?
我有默认值的数据类。
data class Project(
val code: String,
val name: String,
val categories: List<String> = emptyList())
Run Code Online (Sandbox Code Playgroud)
当某些值为空时,Java 反射无法实例化类。我得到了例外
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method Project.<init>, parameter categories
Run Code Online (Sandbox Code Playgroud)
这是因为java.lang.reflect.Constructor<T>.instantiateClass方法需要不为空的参数。
我有类型信息,我有构造函数定义,但我不确定如何调用构造函数以便它使用默认值(这些值来自数据库并且categories可以是null)。有没有办法在 Kotlin 中实现这一目标?
在Java中,可以使用传统的for循环创建一个简单的数组:
ImageButton[] buttons = new ImageButton[count];
for (int i = 0; i < count; i++) {
buttons[i] = view.findViewById(BUTTON_IDS[i]);
}
Run Code Online (Sandbox Code Playgroud)
简单转换为Kotlin会产生以下结果:
val buttons = arrayOfNulls<ImageButton>(count)
for (i in 0..count) {
buttons[i] = view.findViewById<ImageButton>(BUTTON_IDS[i])
}
Run Code Online (Sandbox Code Playgroud)
这个问题是现在数组中的每个元素都是可选的; 这让?操作员摆脱了我的代码.
有没有办法以类似的方式创建数组,但没有可选类型?
我正在尝试Kotlin并从编译器获得消息:
Smart cast to kotlin.String
Run Code Online (Sandbox Code Playgroud)
码:
/*"mTripStatus" is a nullable String*/
var html :String = HTML
html = if (mTripStatus!=null) html.replace("TRIP_STATUS_VALUE", mTripStatus) else html
Run Code Online (Sandbox Code Playgroud)
这是什么意思?
我必须Dao返回简单的对象。如果对象不存在,则Room返回null,但是Android应用程序没有崩溃。另外,如果我将该值分配给非null变量,则应用程序中不会发生崩溃。
道:
@Query("SELECT * FROM users WHERE id LIKE :id LIMIT 1")
abstract fun getById(id: Long): User
Run Code Online (Sandbox Code Playgroud)
不崩溃的代码:
doAsync {
val user: User = userDao.getById(999) // user 999 not exist, userDao returns null
uiThread {
if (user == null) {
Timber.d("user is $user") // "user is null" in log
} else {
Timber.d("user is ${user.email}")
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有两个问题: