If we think about it, we can divide the problem of reverse polymorphism into two separate problems. The first is a question of identity. If I have a value of type Mammal, can I tell whether or not it is in fact a Dog?
The second is then the task of assignment. If I do know it is a dog, can I then assign the value to a variable of type Dog?
Languages either do not address reverse polymorphism at all, address these two issues separately, or combine them together and address them as one.