java - rango - tabla de frecuencia
Si el Número de clase es abstracto, ¿por qué estoy autorizado a escribir el Número n=5? (4)
Number n = new Number(5)
es ilegal, pero el Number n = 5
no lo es. ¿Por qué?
Debido al autoboxing. 5
no es un objeto, por lo que está envuelto en un objeto ( Integer
en este caso) y Integer
es un Number
.
No debería ser. el autoboxing es un gran error.
Es similar a cómo funcionaría lo siguiente:
List bob = new ArrayList();
List es una interfaz, por lo que no puede crear una instancia directamente. Sin embargo, puede declarar una variable de tipo Lista y luego asignarle un objeto concreto que implemente esa interfaz. En la misma línea, puede declarar una variable de tipo Número y luego asignarle cualquier objeto de valor que sea una instancia concreta de ese tipo. Lo que ha hecho con el código funcional es, para todos los efectos (debido al autoboxing):
Number n = new Integer(5);
Fundamentalmente, es porque Number
es una clase abstracta; no hay ningún constructor que corresponda al Number(5)
, e incluso si existiera, todavía no sería capaz de crear una instancia directamente de la clase porque es abstracta.
Como explica Bombe, en el segundo caso realmente está creando un objeto Integer
* que, como una subclase de Number
, se puede asignar a dicha variable. Y como es una clase concreta, puedes crear una instancia.
* Aunque en la práctica es en realidad más equivalente a Integer.valueOf(5)
, que en Sun JRE no creará un objeto Integer adicional sino que usará una versión combinada (como el patrón Flyweight).