在takeIf函数中进行类型检查后进行智能投射

时间:2019-07-19 16:22:38

标签: kotlin types casting functional-programming

我有这个Kotlin代码:

interface Course
class ProgrammingCourse : Course
class MathCourse : Course

...

fun doSomething(id: String) = getCourse(id)
    .takeIf { it is ProgrammingCourse }
    .apply {
      //do something with the course
    }
}

fun getCourse(id: String) : Course {
    //fetch course
}

apply函数中,thisCourse?类型的,应该是ProgrammingCourse?,不是吗?在这种情况下,智能投射无法正常工作。

我猜Kotlin还不支持。我的意思是,有没有一种方法可以不通过功能链接方式使用if/else

1 个答案:

答案 0 :(得分:2)

我刚刚使用as?运算符解决了,该运算符强制转换为ProgrammingCourse或在发生错误时返回null

fun doSomething(id: String) = getCourse(id)
    .let { it as? ProgrammingCourse }
    ?.apply {
      //do something with the course
    }
}

现在,在apply函数中,this类型为ProgrammingCourse(由于?,不可为空)