Rc<Cat> and Rc<Animal> is completely different types, they even differ in size - Rc<Cat> has same size as a ptr, while Rc<Animal> has size of two ptrs. So it's something like to getting &u64 from the &u32. Of course you can convert u32 into u64, but to make &u64 someone else should hold this 8-byte-wide type. But all we have is the &u32, a reference to the 4-byte-wide type.
are we (1) keeping the same "ref count counter object", or are we (2) decrementing the first counter by 1, and creating a new counter object with counter 1 ?
I used to believe (1), but am now considering (2).
Basically the issue is that the conversion requires updating how the handle is stored, and to return a reference, you need somewhere to put that new handle, but you can't use the reference you got as it cannot be modified, and you can't return it either because that would be a return by value.