This following code compiles, but only if I stick to the same type in the Observable<T>
trait Observable<T> {}
struct BaseObservable<T>(T);
struct OtherObservable<T>(T);
impl<T> Observable<T> for BaseObservable<T> {}
impl<T> Observable<T> for OtherObservable<T> {}
struct Subscriber<N> {
output_observable: Box<dyn Observable<N>>,
}
impl<N: 'static> Subscriber<N> {
fn new(v: N) -> Self {
Subscriber {
output_observable: Box::new(BaseObservable(v)),
}
}
fn set(&mut self, v: impl Observable<N> + 'static) {
self.output_observable = Box::new(v);
}
}
fn main() {
let mut s = Subscriber::new(8); // start with integer
s.set(OtherObservable(9)); // can continue only with integers from now on
}
I would like to have something like this:
fn main() {
let mut s = Subscriber::new(8); // start with integer
s.set(OtherObservable('n')); // continue with char or any type not just integer
}
I know where this restriction is, it is in the definition of Subscriber<N>
struct Subscriber<N> {
output_observable: Box<dyn Observable<N>>,
}
where generic N
is propagated further to dynamic trait object, but I don't know how to edit this to break from N
, requirement being that trait Observable<T>
keeps it's signature with generic.
I have tried with adding more generics, function generics, playing with std::marker::Any
but with no success.