Какая польза от ключевого слова where в сигнатуре обобщенной функции c? - PullRequest
0 голосов
/ 19 февраля 2020

Я рефакторинг этого фрагмента:

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
        }
}

1 Ответ

0 голосов
/ 19 февраля 2020

: Disposable Указывает, что тип возвращаемой функции равен Disposable.
, а часть where T : Observable<String> указывает upper bound для параметра типа generic T. Проще говоря, это означает, что T должно быть subtype из Observable<String>.

При работе с generic types вы можете указать 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)

, но если вам нужно указать несколько upper bounds, то вы должны использовать where clause как

// 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

Как указано в документации

В угловых скобках может быть указана только одна верхняя граница. Если для одного и того же параметра типа требуется более одной верхней границы, нам нужно отдельное предложение where.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...