gpt4 book ai didi

android - Kotlin `by` 关键字是否适用于可为空的委托(delegate)?

转载 作者:行者123 更新时间:2023-12-02 13:36:34 25 4
gpt4 key购买 nike

我对 Kotlin 编译器功能和 by 感到非常兴奋特别是 - 它节省了生成凝胶代码的时间:

https://kotlinlang.org/docs/reference/delegation.html

但我希望代表成为 可以为空 并委托(delegate)代码首先检查它是否为空,如果是则返回:

interface Base {
val message: String
fun print()
}

class BaseImpl(val x: Int?) : Base {
override val message = "BaseImpl: x = $x"
override fun print() { println(message) }
}

class Derived(b: Base?) : Base by b {
// This property is not accessed from b's implementation of `print`
override val message = "Message of Derived"
}

fun main() {
val b = BaseImpl(10)
val derived = Derived(b)
derived.print()
println(derived.message)
}

编译时 ^ 我得到 Type mismatch: inferred type is Base? but Base was expected .

Kotlin 还有可能吗?

更详细地说,我希望 Kotlin 编译器在 https://developer.android.com/reference/android/webkit/WebChromeClient 中生成对包装 impl ( extWebChromeClient ) 的转发调用如下:
private WebChromeClient intWebChromeClient = new WebChromeClient()
{
@Override
public void onReceivedTitle(WebView view, String title)
{
if (extWebChromeClient != null)
{
extWebChromeClient.onReceivedTitle(view, title);
}
}
...

最佳答案

您可以使用 dynamic proxies 自己制作。 ,虽然我不会真的推荐它。请注意,对于非 void方法没有办法要求覆盖它们。下面的实现只是无条件地为它们抛出异常,但是您仍然可以将它们称为非空 x .

inline fun <reified T : Any> nullableProxy(x: T?): T {
val handler = InvocationHandler { _, method, args ->
if (method.returnType == Void.TYPE) {
if (x != null) {
method.invoke(x, *(args ?: arrayOf()))
}
} else
throw UnsupportedOperationException("Non-void method")
}

return Proxy.newProxyInstance(
T::class.java.classLoader,
arrayOf(T::class.java),
handler) as T
}

class Derived(b: Base?) : Base by nullableProxy(b)

这也不会像直接实现方法那样执行。

关于android - Kotlin `by` 关键字是否适用于可为空的委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55358582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com