Удалить обнуляемость из параметра универсального типа

#kotlin #generics

#kotlin #общие

Вопрос:

Есть ли способ удалить обнуляемость из универсального параметра?

 interface Test<A: Any?> {
   fun <B> surelyNotNull(): B // must be T for any nullable type T?
}
// usage
val test: Test<String?> = TODO()
test.surelyNotNull() // should return non-nullable String


  

Комментарии:

1. Что вы хотите сделать, если этот переданный тип равен null? Этот тип null означает, что вам нужно как-то справиться с этим, вы не можете просто игнорировать его

2. Я хочу создать конструктор для библиотеки проверки. т.Е. ValidatorBuilder<A> { fun notNull(): ValidatorBuilder<B> } . После notNull() того, как мы, очевидно, имеем дело с ненулевым типом, и вопрос в том, как его представить.

Ответ №1:

Я не совсем уверен, чего вы пытаетесь достичь и как вы хотите это использовать, но как насчет этого?

 interface ValidationBuilder<A : Any> {
    fun validate(a: A?): A
}

class NotNulLValidator<A : Any> : ValidationBuilder<A> {
    override fun validate(a: A?): A {
        if (a == null) throw IllegalArgumentException()
        return a
    }
}
  

Ответ №2:

Как насчет указания ненулевого универсального типа в interface ? Вам нужно будет соответствующим образом пометить все методы, возвращающие значение null.

 interface Test<A : Any> {
   fun maybeNull(): A?
   fun surelyNotNull(): A
}

val test: Test<String> = TODO()
val notNullable: String = test.surelyNotNull()
val nullable: String? = test.maybeNull()
  

Ответ №3:

Вы можете выразить это как метод расширения:

 fun <A : Any> ValidatorBuilder<A?>.surelyNotNull(): ValidatorBuilder<A> = TODO()
  

Хотя в этом случае вы не можете реализовать его для некоторых ValidatorBuilder иначе, чем для других.