Как сказать, что метод расширения возвращает ненулевое значение, если тема не пуста - PullRequest
3 голосов
/ 08 июля 2019

Я реализовал следующий метод:

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 не равен нулю? Есть ли другой способ сделать это?

1 Ответ

4 голосов
/ 08 июля 2019

если я вас хорошо понимаю, это то, что вы хотите

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

T расширяет строку? означает, что тип T может быть String или null или и то и другое, и каждый тип T имеет значение, функция также возвращает этот тип

...