【发布时间】:2019-08-16 22:06:16
【问题描述】:
我对 Kotlin 编译器功能特别是 by 感到非常兴奋 - 它节省了生成凝胶代码的时间:
https://kotlinlang.org/docs/reference/delegation.html
但我希望委托是可空并委托代码首先检查它是否为空,如果是则返回:
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);
}
}
...
【问题讨论】:
-
无论这是否可行,我都觉得不合理。无论如何,它只适用于
void方法。 -
运算符
?.通过使返回类型为空来处理非 void 方法。这不可能在这里工作,因为它会违反Base的合同。理论上,没有什么可以阻止它在所有方法都返回可空类型的接口上工作。 -
@Marko 我觉得这很合理。覆盖可能需要返回值的方法。无论如何,它节省了大量编写样板代码的时间。
-
无论如何你都不能委托
WebChromeClient,因为它是一个类,而不是一个接口。 -
实际上,由于
WebChromeClient不是抽象的,并且它的回调默认情况下什么都不做,为什么不首先让extWebChromeClient不可为空并将其初始化/设置为WebChromeClient()而不是null?无需生成任何代码。
标签: android kotlin delegation