Por favor, no llegué a entender el polimorfismo.
teniendo este ejemplo:
Object o = new String ("foo");
No puedo hacer
o.substring (1,2)
¿alguien puede explicar este problema a mí?
Esto es una consecuencia del principio de sustitución de liskov , que establece (resumido):
Si S y T son objetos, y T es un subtipo de S, entonces T se puede usar donde S se espera.
String
-es un subtipo de Object
, por lo que si sus Espera operación de asignación Object
, entonces estará feliz de aceptar Object
o cualquiera de sus subtipos.
(Nota: Object
no es una String
Todos. String
S son Object
s, pero no todos los Object
s son String
s.)
Esto no quiere decir que usted consigue el acceso a cualquiera de los métodos del subtipo. Teniendo en cuenta la jerarquía de herencia, una Object
no tiene ninguna pista acerca de cualquiera de los métodos específicos de sus hijos, ni puede - no hay manera de informar a una clase ancestro de las capacidades de su descendiente. Debido a que Object
no tiene substring
método asociado con ella, su código se traduce correctamente en un fallo de compilación.
(Y debe, dado que Object
es el antepasado de todas las clases. No hay ninguna garantía de que cualquiera fijada Object
es un String
.)
El consejo de pie es no utilizar un exceso inspecific tipo de objeto (a medida que avanza en la cadena de jerarquía, las capacidades se vuelven menos específico - que perder funcionalidad a medida que suben a Object
) para lograr algo específico para un tipo más específico.