Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin-当前实例的返回类型_Kotlin - Fatal编程技术网

Kotlin-当前实例的返回类型

Kotlin-当前实例的返回类型,kotlin,Kotlin,我正在Kotlin建立一个验证库。基类是abstract,实现了适用于所有类型的方法isNotNull例如: abstract class Validator<V>(protected val value: V?) { fun isNotNull(): Validator<V> { if(value == null) { // ... some validation handling here ... }

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

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

        return this
    }
}
上面的代码不起作用,因为
.isNotNull()
返回的是
Validator
,而不是
IntValidator
,因此
.isNotZero()
不再在范围内


有没有一种方法可以让方法返回实例化它们的类型(在我的例子中,我希望它返回
IntValidator
,而不是
Validator
)?

单向,但使用未选中的强制转换:

fun main(args: Array<String>) {
  val validator = IntValidator(2)

  validator
    .isNotNull()
    .isNotZero()
}

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

        return this as R
    }
}

class IntValidator(value: Int?) : Validator<Int, IntValidator>(value) {
    fun isNotZero(): IntValidator {
        if(value == 0) {
            // ... some validation handling here ...
        }

        return this
    }
}
fun main(args:Array){
val validator=IntValidator(2)
验证器
.isNotNull()
.isNotZero()
}
抽象类验证器(受保护的val值:V?){
open fun isNotNull():R{
如果(值==null){
//…这里有一些验证处理。。。
}
将此作为R返回
}
}
类IntValidator(值:Int?):验证器(值){
乐趣不是零():IntValidator{
如果(值==0){
//…这里有一些验证处理。。。
}
还这个
}
}

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

val validator = IntValidator(myNullableInteger)
with(validator) {
    isNotNull()
    isNotZero()
}
IntValidator的范围内,这两种方法都可以访问。

如上所述,您可以为此使用扩展方法:

abstract class Validator<V>(internal val value: V?)
fun <T: Validator<U>, U> T.isNotNull(): T {
    if(this.value == null) {
        // ... some validation handling here ...
    }
    return this
}

class IntValidator(value: Int?) : Validator<Int>(value)

@Suppress("FINAL_UPPER_BOUND")
fun <T: IntValidator> T.isNotZero(): T {
    if (this.value == 0) {
        // ... some validation handling here ...
    }
    return this
}

fun main() {
    val validator = IntValidator(0)
    validator
            .isNotNull()
            .isNotZero()
}
抽象类验证器(内部val值:V?)
fun T.isNotNull():T{
if(this.value==null){
//…这里有一些验证处理。。。
}
还这个
}
类IntValidator(值:Int?):验证器(值)
@抑制(“最终上限”)
乐趣T.isNotZero():T{
如果(this.value==0){
//…这里有一些验证处理。。。
}
还这个
}
主要内容(){
val validator=IntValidator(0)
验证器
.isNotNull()
.isNotZero()
}

这允许您将对象类型用作函数的通用参数,这意味着您也可以接收对象类型作为结果。通用边界允许您在返回调用实例的类型时使用类型安全。

这不是我见过的最性感的事情,但必须+1事实证明,这是最优雅的解决方案。
val validator = IntValidator(myNullableInteger)
with(validator) {
    isNotNull()
    isNotZero()
}
abstract class Validator<V>(internal val value: V?)
fun <T: Validator<U>, U> T.isNotNull(): T {
    if(this.value == null) {
        // ... some validation handling here ...
    }
    return this
}

class IntValidator(value: Int?) : Validator<Int>(value)

@Suppress("FINAL_UPPER_BOUND")
fun <T: IntValidator> T.isNotZero(): T {
    if (this.value == 0) {
        // ... some validation handling here ...
    }
    return this
}

fun main() {
    val validator = IntValidator(0)
    validator
            .isNotNull()
            .isNotZero()
}