Declaré un ArrayList de String por genérico, pero lo rellené de algún modo con Integer. ¿Rompió Java?
Quería llenar un ArrayList con [0..10] independientemente de si se pasaba Integer o String, y sin querer hice esto:
public class Main {
public static void main(String[] args) {
Task1
System.out.println(task1instance.test());
}
}
public class Task1
ArrayList
private void fillArray() { //Soporte de prellenado para String y Integer
for (Integer i = 0; i < 10; i++) {
array.add((T) i); //magia
}
}
ArrayList
fillArray();
//smartSwap();
System.out.println(this.array.get(0).getClass());
return this.array;
}
Tengo una salida como:
class java.lang.Integer
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Pero en el main pasé un
Un ArrayList de String se llenó con Integer, pero si intentamos hacer una conversión directa, entonces tenemos un error de compilación:
Integer a = 9;
String b = (String) a; //error: Tipos incompatibles: no se puede convertir ‘java.lang.Integer’ a ‘java.lang.String’
¿Me puedes decir por favor qué sucedió realmente?
davy.ai
Cuando pasaste un
a la claseTask1
, el parámetro de tipoT
se estableció comoString
. Esto significa que elArrayList
se declaró comoArrayList
. Sin embargo, al llamar afillArray()
, se convirtiói
enT
, que eraString
. Por eso obtuviste un error de compilación al intentar convertirInteger
directamente enString
.El método
fillArray()
pudo llenar elArrayList
con valores deInteger
porque elArrayList
se declaró comoArrayList
, yInteger
es una subclase deString
. Esto significa que elArrayList
pudo aceptar valores deInteger
, aunque se declaró comoArrayList
.