我正在Kotlin Build 一个验证库 . 基类是 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?不是null而不是零
val validator = IntValidator(myNullableInteger)
validator
.isNotNull()
.isNotZero()
上面的代码不起作用,因为 .isNotNull()
返回 Validator<V>
,而不是 IntValidator
,所以 .isNotZero()
不再在范围内 .
有没有办法让方法返回实例化它们的类型(在我的情况下,我希望它返回 IntValidator
,而不是 Validator<T>
)?
3 回答
也许您应该重新考虑API设计 . 那么不链接方法和使用范围函数呢?
在
IntValidator
的范围内,两种方法都是可访问的 .一种方法,但有一个未经检查的演员:
如this kotlinlang thread所述,您可以使用扩展方法:
这允许您将对象类型用作函数的泛型参数,这意味着您也可以接收对象类型作为结果 . 通用边界允许您在返回调用实例的类型时使用类型安全性 .