Меня очень порадовали возможности компилятора 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 генерировал переадресацию вызовов для упакованного impl (extWebChromeClient
) в https://developer.android.com/reference/android/webkit/WebChromeClient следующим образом:
private WebChromeClient intWebChromeClient = new WebChromeClient()
{
@Override
public void onReceivedTitle(WebView view, String title)
{
if (extWebChromeClient != null)
{
extWebChromeClient.onReceivedTitle(view, title);
}
}
...