【问题标题】:How to tell that an extension method returns non-null if subject is not null如果主题不为空,如何判断扩展方法返回非空
【发布时间】:2019-11-17 22:54:21
【问题描述】:

我已经实现了以下方法:

private fun String?.replaceHolder(item: String): String? {
  return this?.replace("\$deployUnit", item)
}

使用它的代码如下所示:

val a = "aaa".replaceHolder("fff")

但是,a 的推断类型是String?。 对于合同,我可以说如果返回值不为空,那么主题不为空:

@ExperimentalContracts
private fun String?.replaceHolder(item: String): String? {
  contract {
    returnsNotNull() implies (this@replaceHolder != null)
  }
  return this?.replace("\$deployUnit", item)
}

可以说反话吗?我的意思是推断a的类型不为空?还有其他方法吗?

【问题讨论】:

  • 我自己的偏好可能是在String 上定义它,并在需要时明确使用?.

标签: kotlin type-inference


【解决方案1】:

如果我理解你,这就是你想要的

private fun <T: String?> T.replaceHolder(item: String): T {
    return this?.replace("\$deployUnit", item) as T
}

T 扩展字符串?表示 T 类型可以是 String 或 null 或两者兼而有之,每个类型 T 都是,函数也返回该类型

【讨论】:

  • 谢谢!除了我想要的未经检查的演员外,这很棒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2012-02-22
  • 2020-08-09
  • 2016-05-31
相关资源
最近更新 更多