La fundición no tiene que ver con el tamaño del objeto: se trata del rango de la variable.
Por 'rango', me refiero a la variedad de valores diferentes que la variable puede contener. Si asigna de una variable a otra cuyo rango es un superconjunto de la primera, no necesita lanzar, porque sabe que la asignación estará bien. Pero cuando asigna de una variable a otra cuyo rango es un subconjunto, necesita lanzar, porque la asignación puede no ser posible.
Imagine que tiene dos contenedores: una tina de plástico y una cesta de compras de alambre del mismo tamaño. Claramente, cualquier cosa que pueda guardar en la canasta de alambre, puede guardarla en la tina. Pero no todo lo que puede guardar en la bañera puede guardarse en la canasta. Una pila de manzanas, puedes. Pero un montón de pasas, no puedes, caen a través de los agujeros en la canasta. Por lo tanto, el rango de cosas que la bañera puede contener es mayor que el rango de cosas que la canasta puede contener, aunque ambas tienen el mismo tamaño.
En esa analogía, la fundición es como comprobar si lo que está moviendo encajará en el nuevo contenedor. No es necesario que verifique cuándo mueve las cosas de la canasta a la bañera, pero sí debe verificar cuándo se mueve de la bañera a la canasta, de lo contrario terminará con fruta en todo el piso.
En sus casos específicos, sabemos que cada ser humano es un mamífero, pero que no todos los mamíferos son humanos, por lo que el rango de una variable de tipo Mamífero es mayor que el de una variable de tipo Humano. También sabemos que el rango de un doble (aproximadamente 2^1024 - - (2^1024)) es mayor que el de un int (2^31-1 - -2^31). Por lo tanto, asignar de la primera a la última en cualquier caso requiere un elenco, pero de la segunda a la primera no.
No debería pensar en objetos en términos de tamaño de memoria, sino en términos de lo que representan. – Jacob