java - standard - ¿Por qué no usar Object para todos los parámetros del método?
jstl java standard tag library (3)
Existe una conversión implícita definida entre todos los tipos primitivos y sus contrapartes de objeto respectivas:
int -> Integer
char -> Character
etc...
Esto se llama autoboxing .
¿Hay alguna razón específica por la que las personas no siempre usan "Objeto" como su tipo de datos para pasar valores?
Ya que Java está fuertemente tipado, no se puede hacer mucho con Object
.
Por ejemplo, intente esto:
static Object add(Object a, Object b) {
return a + b; // won''t compile
}
Esto se debe a que los métodos, operadores, etc. disponibles para usar dependen del tipo estático de la variable.
println
puede aceptar Object
porque solo necesita llamar al método toString
. Si solo necesita la funcionalidad limitada proporcionada por los métodos en Object
, entonces claro, puede usarla como un tipo. Sin embargo, esto rara vez es el caso.
public class helloworld {
public static void main(String[] args) {
String text = "Hello World";
l(text);
int n = 0;
l("--------------------------");
l(n);
}
public static void l(Object obj) {
System.out.println(obj);
}
}
Escribí este sencillo programa en Java y funcionó. Ahora estoy confundido de que si todos los tipos de datos ( int
, char
, double
, etc.) están Object
en Object
, ¿por qué especificamos qué tipo de datos queremos aceptar cuando pasamos valores?
Quiero decir, siempre podemos usar el tipo de datos Object
como se usa en la función l
. ¿Hay alguna razón específica por la que las personas no siempre usan el Object
como su tipo de datos para pasar valores?
Para las primitivas que mencionó, no son realmente objetos, simplemente se encajonarán en su representación como un objeto. Un int
se convertiría en un Integer
, un long
se convertiría en un Long
etc.
Lee este artículo sobre autoboxing .
En cuanto a tu pregunta
¿Hay alguna razón específica por la que las personas no siempre usan "Objeto" como su tipo de datos para pasar valores?
Si especifica Object
como el parámetro de su método, no podrá llamar a los métodos que contiene el objeto real sin hacer una conversión. Por ejemplo, si tiene un objeto personalizado AnyObject
que contiene un método anyMethod
, no podrá llamarlo sin convertir el objeto en AnyObject
.
También será inseguro, ya que podrá pasar cualquier tipo de objeto a un método que no esté diseñado para funcionar correctamente con ninguno de estos tipos. Un método que contiene solo System.out.println
no es representativo de un caso de uso real, funcionará con cualquier objeto simplemente porque, por defecto, println
llamará al método toString
que ya está definido en un Object
.
Si bien parece una función que parece aceptar todos los tipos de parámetros, tendrá que lidiar con estos
- La firma de la función se vuelve menos informativa.
- No más sobrecargas
- Debe realizar una gran cantidad de verificación de tipos y conversión en el cuerpo de la función para evitar errores de tiempo de ejecución.
- Aunque el método aparentemente acepta todos los objetos, nunca sabría el subconjunto real de ellos hasta que vea la definición del método.
- El cuerpo de la función podría terminar teniendo más código para eliminar los tipos incorrectos que para su objetivo real. Por ejemplo, su función solo imprime el valor. Imagina una función que hace predominantemente alguna operación de enteros.
- Aumenta la probabilidad de errores en el tiempo de ejecución, ya que el compilador no puede lanzar errores por faltas de conversión.