Как я могу обработать эту ошибку, которая не является подтипом переопределенной - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь написать проверяемый интерфейс формы в 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 вместе или, может быть, есть другой способ достижения моей цели.

1 Ответ

0 голосов
/ 21 ноября 2018

Вы можете сделать абстрактный класс Validatable универсальным классом, а подкласс предоставить объект, который предоставляет для проверки как объект Validation, так и сам себя как target, например,

abstract class Validatable<T> {
    protected class ValidationInfo<T>(val target: T, val validation: Validation<T>)

    protected abstract val validationInfo: ValidationInfo<T>

    fun validate() = validationInfo.let { it.validation.validate(it.target) }
}

class LoginForm : Validatable<LoginForm>() {
    val name: String = "Onur"
    val age: Int = 23

    override val validationInfo = ValidationInfo(this, Validation {
        "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"
        }
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...