#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
иначе, чем для других.