Я пытаюсь обернуть rxjava timeout
method, чтобы сделать его доступным for scala.Границы типа Scala и общий набор Java
Подобно many other methods Я попытался это:
def timeout[U >: T](timeout: Duration, other: Observable[U]): Observable[U] = {
val otherJava: rx.Observable[_ <: U] = other.asJavaObservable
val thisJava: rx.Observable[_ <: U] = this.asJavaObservable
toScalaObservable[U](thisJava.timeout(timeout.length, timeout.unit, otherJava))
}
Но я получаю следующее сообщение об ошибке:
Observable.scala:1631: error: overloaded method value timeout with alternatives:
($1: Long,x$2: java.util.concurrent.TimeUnit,x$3: rx.Scheduler)rx.Observable[_$85] <and>
($1: Long,x$2: java.util.concurrent.TimeUnit,x$3: rx.Observable[_ <: _$85])rx.Observable[_$85]
cannot be applied to (Long, scala.concurrent.duration.TimeUnit, rx.Observable[_$84])
toScalaObservable[U](thisJava.timeout(timeout.length, timeout.unit, otherJava))
оригинальный метод Java:
public Observable<T> timeout(long timeout, TimeUnit timeUnit, Observable<? extends T> other) {
return create(OperationTimeout.timeout(this, timeout, timeUnit, other));
}
Я не очень не знакомы ни с Java, ни с Scala (и всеми ограничениями типа), но насколько я понимаю: оба otherJava
, а также thisJava
имеет тип rx.Observable[U]
, так почему бы им не выйти?
Но тогда я потерял гибкость передачи супертипа. Наблюдаемый как «другой». Я думаю, что для большей гибкости библиотека должна допускать другой тип 'U'. Также обратите внимание, что ' extends T>' действительно переведен на '[_ <: T]' как [отмеченный в истории scala] (http://www.scala-lang.org/download/changelog.html#java_generics) – ClojureMostly
@Aralo о, ты совершенно прав. Фактически, он даже не компилируется без некоторого параметра типа 'U', потому что ковариантный тип не может появиться (в' other') в контравариантной позиции. Я удалил свой первый пункт и обновил код. – gourlaysama
Отличное объяснение. Я следую вашим аргументам и работает (см. [Мой запрос на тягу] (https://github.com/Netflix/RxJava/pull/720)). Однако, это все еще запутывает, так как я думал, что они одного типа. Давайте проверим его с помощью «List», который также является ковариантным: http://paste.ubuntu.com/6692064/ Вот почему я думал, что они оба одинаковы/типа. Все еще запутано. – ClojureMostly