我通过泛型声明了 String 的 ArrayList,但不知何故用 Integer 填充了它。我打破了java吗?

I declared ArrayList of String by generic, but filled it with Integer somehow. Did I break java?

我想用[0..10]填充一个ArrayList,不管它是Integer还是String传递,无意中这样做:

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;
}

我的输出如下:

class java.lang.Integer
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

但总的来说我通过了一个

< String >

一个String的ArrayList被Integer填满了,但是如果我们尝试直接转换它,就会出现编译错误:

Integer a = 9;
String b = (String) a; //error: Inconvertible types; cannot cast 'java.lang.Integer' to 'java.lang.String'

请告诉我,到底发生了什么?

不,您不会得到例外。你得到的是编译器在 array.add((T) i); //magic 行发出的“未经检查的转换”警告,它告诉你这个确切的问题。