I wanted to fill an ArrayList with [0..10] no matter if it is Integer or String passed, and unintentionally did this:
public class Main {
public static void main(String[] args) {
Task1<String> task1instance = new Task1<>();
System.out.println(task1instance.test());
}
}
public class Task1<T extends Serializable> {
ArrayList<T> array = new ArrayList<>(10);
private void fillArray() { //String and Integer autofill supported
for (Integer i = 0; i < 10; i++) {
array.add((T) i); //magic
}
}
ArrayList<T> test () {
fillArray();
//smartSwap();
System.out.println(this.array.get(0).getClass());
return this.array;
}
I have output like:
class java.lang.Integer
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
But in the main I passed a
< String >
An ArrayList of String was filled with Integer, but if we try to cast it directly, then we have a compilation error:
Integer a = 9;
String b = (String) a; //error: Inconvertible types; cannot cast 'java.lang.Integer' to 'java.lang.String'
Tell me please, what actually happened?
No, you won't get an exception. What you got was an "unchecked cast" warning from the compiler on the line array.add((T) i); //magic
, which was telling you about this exact issue.