Я пытаюсь написать проверяемый интерфейс формы в Kotlin.В части проверки я использую https://github.com/kamedon/Validation.
Вот очень простой код, который я пытаюсь запустить;
import com.kamedon.validation.Validation
abstract class Validatable {
abstract val validation: Validation<Any>
fun validate() = validation.validate(this)
}
class LoginForm : Validatable() {
val name: String = "Onur"
val age: Int = 23
override val validation = Validation<LoginForm> {
"name" {
be { name.length >= 5 } not "5 characters or more"
be { name.length <= 10 } not "10 characters or less"
}
"age" {
be { age >= 20 } not "Over 20 years old"
}
}
}
fun main(args: Array<String>) {
val user = LoginForm()
val result = user.validate()
println(result)
}
Этот код дает мне;
Type of 'validation' is not a subtype of the overridden property 'public abstract val validation: Validation<Any> defined in Validatable'
Если я использую Validation<out Any>
в Validatable, он говорит:
Kotlin: Out-projected type 'Validation<out Any>' prohibits the use of 'public final fun validate(value: T): Map<String, List<String>> defined in com.kamedon.validation.Validation'
Если я использую Validation<in Any>
в Validatable, он говорит;
Kotlin: Type of 'validation' is not a subtype of the overridden property 'public abstract val validation: Validation<in Any> defined in Validatable'
Если я использую Validation<Any>
вместос Validation<LoginForm>
в LoginForm, код выполняется, но на этот раз имя и возраст внутри validation
используются из класса внутри самого себя.Я не хочу менять это в отношении использования библиотеки.
В любом случае можно использовать ключевые слова in
и out
вместе или, может быть, есть другой способ достижения моей цели.