Boh*_*n90 7 nullable kotlin kotlin-extension
假设我有一个Foo带有可空值的简单类String?
data class Foo(
val bar: String?
)
Run Code Online (Sandbox Code Playgroud)
我创建了一个简单的函数 capitalize
fun captitalize(foo: Foo) = when {
foo.bar != null -> runCatching { foo.bar.capitalize() }
else -> ""
}
Run Code Online (Sandbox Code Playgroud)
这很好用,因为尽管编译器推断foo.bar的类型可以为空,但它不能为null。但是后来我决定编写与扩展相同的函数Foo
fun Foo.captitalize2() = when {
bar != null -> runCatching { bar.capitalize() }
else -> ""
}
Run Code Online (Sandbox Code Playgroud)
突然编译器不再能够推断出bar不是null,而IntelliJ告诉我“在类型为null的接收者上仅允许安全(?。)或非null断言(!!。)调用。串?”
谁能解释为什么?
我认为这是因为在第一种情况下你调用这个函数:
public inline fun <R> runCatching(block: () -> R): Result<R> {
return try {
Result.success(block())
} catch (e: Throwable) {
Result.failure(e)
}
}
Run Code Online (Sandbox Code Playgroud)
但在第二种情况下,您正在使用接收器调用函数:
public inline fun <T, R> T.runCatching(block: T.() -> R): Result<R> {
return try {
Result.success(block())
} catch (e: Throwable) {
Result.failure(e)
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说,这看起来像是 Kotlin 编译器中的一个问题,因为如果您自己内联此函数的代码,它会正常工作:
fun Foo.captitalize2() = when {
bar != null -> try {
Result.success(bar.capitalize())
} catch (e: Throwable) {
Result.failure<String>(e)
}
else -> ""
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果我是你,我想capitalize2这样写我的函数:)
fun Foo.captitalize2() = bar?.capitalize() ?: ""
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |