泛型函数签名中where关键字的作用及Kotlin泛型扩展语法疑问
问题2:关于Disposable where T : Observable<String>的语法困惑
先拆解你的扩展函数:
fun <T> T.bindTo(textView: TextView): Disposable where T : Observable<String> { return observeOn(mainThread()) .subscribe { remark -> textView.text = remark } }
这个写法其实和fun <T : Observable<String>> T.bindTo(textView: TextView): Disposable完全等价,只是用where声明泛型约束的另一种风格。
为什么会有这种写法?核心是为了扩展性:如果以后你需要给T叠加更多约束(比如同时要求T实现某个自定义接口),直接在where后面追加条件即可,比如:
fun <T> T.bindTo(textView: TextView): Disposable where T : Observable<String>, T : MyTrackableInterface { this.trackEvent() // 可以调用自定义接口的方法 return observeOn(mainThread()) .subscribe { remark -> textView.text = remark } }
回到你的场景,where T : Observable<String>的作用就是:限定这个扩展函数只能被Observable<String>(或其子类)的实例调用,这样在函数内部你就能安全调用observeOn、subscribe这些Observable的方法,最后返回Disposable,和你原代码的逻辑完全对齐。
单约束场景下这只是风格选择,但多约束场景下where是必须的,所以很多开发者会习惯用它统一管理泛型约束,让代码更易读、易扩展。
内容的提问来源于stack exchange,提问作者John smith
相关产品推荐
相关产品推荐

