1

我需要用 Java 装饰一个实例,并希望代表团在 Kotlin 中(更容易)。

问题是我在定义上遇到编译错误。

我如何定义inner能够接收空值?

open class ConnectionDecorator(var inner: Connection?) : Connection by inner // Getting an error on the right inner

Java的示例用法:

new ConnectionDecorator(null).close();

* 这是一个简化的示例,尝试在 Java 中使用 Kotlin 的委托,其中传递的内容可以为 null。

4

2 回答 2

1

如果为空,您可以提供空连接对象inner,例如:

//                             v--- the `var` is unnecessary
open class ConnectionDecorator(var inner: Connection?) : Connection by wrap(inner)


fun wrap(connection: Connection?): Connection = when (connection) {
    null -> TODO("create a Null Object") 
    else -> connection
}

其实不需要这样的ConnectionDecorator,没有意义,因为当你使用委托的时候,你还需要重写一些方法来提供额外的操作,例如:log。您可以wrap直接使用方法,例如:

val connection:Connection? = null;

wrap(connection).close()

您应该使innerto不可为空并通过创建ConnectionDecorator实例wrap,例如:

//                                        v--- make it to non-nullable
open class ConnectionDecorator(var inner: Connection) : Connection by inner {
    fun close(){
       inner.close();
       log.debug("connection is closed");
    }
}

val source:Connection? = null;

//                                          v--- wrap the source
val target:Connection = ConnectionDecorator(wrap(source))

target.close()
于 2017-07-20T12:31:02.000 回答
0

尝试这个

ConnectionDecorator(null).close();

open class ConnectionDecorator(var inner: Connection?) : 内部连接!!

希望它的工作

于 2017-07-20T12:32:46.783 回答