【问题标题】:What is the use of where keyword in a generic function's signature?泛型函数签名中 where 关键字的用途是什么?
【发布时间】:2020-02-19 13:35:22
【问题描述】:

我重构了这个sn-p:

remark.observeOn(mainThread())
      .subscribe { remark ->
          remark_box.visible = remark.isNotEmpty()
          remark_tv.text = remark
      }
      .addTo(CompositeDisposable())

使用这个扩展,但我迷失了 : Disposable where T : Observable<String> 请问有人能解释一下吗?

remark.bindTo(remark_tv)
      .addTo(CompositeDisposable())

fun <T> T.bindTo(textView: TextView): Disposable where T : Observable<String> {
    return observeOn(mainThread())
        .subscribe { remark ->
            textView.text = remark
        }
}

【问题讨论】:

    标签: android generics kotlin refactoring rx-java


    【解决方案1】:

    : Disposable 表示你的函数的返回类型是Disposable
    where T : Observable&lt;String&gt; 部分在generic 类型参数T 上指定upper bound。简单来说,这意味着T 必须是subtypeObservable&lt;String&gt;

    使用generictypes 时,可以指定单个upper bound

    // This function can only be called with types implementing Collection<Int>
    fun <T: Collection<Int>> someFun(first: T, second: T)
    
    // If you try to call it as following, it will not compile
    someFun(listOfStrings, listOfStrings)
    

    但是如果你需要指定多个upperbounds那么你必须使用whereclause作为

    // This function can only be called with types implementing Iterable<Int>
    // as well as Serializable
    fun <T> someFun(first: T, second: T): Int where  T: Iterable<Int>,T: Serializable
    
    // This does not work, you can not comma separate the upper bounds
    fun <T: Iterable<Int>, Serializable> someFun(first: T, second: T): Int
    

    正如documentation 所述

    尖括号内只能指定一个上限。如果 同一个类型参数需要多个上界,我们需要一个 单独的 where 子句。

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 2014-05-26
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      相关资源
      最近更新 更多