Um, you're right about the variance issues of Java generics used by Scala. Release step by step.
Look at your implementation:
// does not compile (with your original error)
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))
}
, , A thisJava (A <: U, thisJava rx.Observable[A]). timeout thisJava: rx.Observable[A] rx.Observable[_ <: A], rx.Observable[_ <: U]: , . !
, A U, thisJava rx.Observable[U], timeout rx.Observable[_ <: U], otherJava. :
// still does not compile, sadly
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 // variance error
toScalaObservable[U](thisJava.timeout(timeout.length, timeout.unit, otherJava))
}
. java rx.Observable , java . Scala , .
, Scala, a rx.Observable[_ <: U] a rx.Observable[U], , , this.asJavaObservable a rx.Observable[_ <: U].
[*], rx.Observable<T> , :
// this compiles and *should* work
def timeout[U >: T](timeout: Duration, other: Observable[U]): Observable[U] = {
val otherJava: rx.Observable[_ <: U] = other.asJavaObservable
val thisJava = this.asJavaObservable.asInstanceOf[rx.Observable[U]]
toScalaObservable[U](thisJava.timeout(timeout.length, timeout.unit, otherJava))
}
, Scala Java , .
, asJavaObservable a rx.Observable[T] _ <: T , , , , ...
[*] " "