我通过泛型声明了 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
行发出的“未经检查的转换”警告,它告诉你这个确切的问题。
我想用[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
行发出的“未经检查的转换”警告,它告诉你这个确切的问题。