我正在Kotlin中建立验证库。基类是abstract,它实现适用于所有类型的方法。 isNotNull例如:

abstract class Validator<V>(protected val value: V?) {
    fun isNotNull(): Validator<V> {
        if(value == null) {
            // ... some validation handling here ...
        }

        return this
    }
}

然后,我将验证器分为特定类型:
class IntValidator(value: Int?) : Validator<Int>(value) {
    fun isNotZero(): IntValidator {
        if(value == 0) {
            // ... some validation handling here ...
        }

        return this
    }
}

现在说我要验证一个Int吗?不为空且不为零
val validator = IntValidator(myNullableInteger)

validator
    .isNotNull()
    .isNotZero()

上面的代码不起作用,因为.isNotNull()返回Validator<V>而不是IntValidator,因此.isNotZero()不在范围内。

方法是否可以返回实例化它们的类型的方法(在我的情况下,我希望它返回IntValidator,而不是Validator<T>)?

最佳答案

也许您应该重新考虑API设计。不链接方法而是使用范围函数呢?

val validator = IntValidator(myNullableInteger)
with(validator) {
    isNotNull()
    isNotZero()
}

IntValidator的范围内,两种方法都可以访问。

10-06 10:06