我需要在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。
答案 0 :(得分:1)
如果inner
为空,则可以提供Null Connection Object,例如:
// 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()
您应该inner
到不可空并按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()
答案 1 :(得分:0)
试试这个
ConnectionDecorator(空).close();
open class ConnectionDecorator(var inner:Connection?):内连接!!
希望它的工作