简单的回答
对。
更详细的答案
您可以使用泛型集合,而无需
值,例如:
ArrayList a = new ArrayList();
a.add(2);
a.add("String");
使用集合而不使用
是个坏习惯,大多数ide/编译器都会在这里给出警告。你可以通过使用
Object
,即:
ArrayList a = new ArrayList();
或者可以找到这些元素必须具有的一些公共接口或超类型,例如
ArrayList
-你可以存储不同的对象
Number
超类,即BigDecimal、BigInteger、Byte、Double、Float、Integer、Long、Short:
ArrayList a = new ArrayList();
a.add(2); // integer
a.add(42L); // long
a.add(123.45d); // double
System.out.println(a.toString()); // => [2, 42, 123.45]
注意,它本质上意味着
a
元素是
数字
类,即不能要求执行子类特定的方法(例如,
Double#isInfinite()
,它不存在于
数字
尽管您可以在运行时进行类型转换,但如果您知道进行类型转换是安全的:
a.get(2).isInfinite() // compile-time error
((Double) a.get(2)).isInfinite() // => false
((Double) a.get(1)).isInfinite() // run-time error (ClassCastException)
运行时类型转换通常也不受欢迎,因为它有效地规避了适当的编译时类型安全性。
还要注意,不可能分配(或使用)
阵列列表
代替
ArrayList
反之亦然,即无法编译:
public void printNumbers(ArrayList list) {
list.forEach(System.out::println);
}
ArrayList a = new ArrayList();
printNumbers(a); // "incompatible types"
除此之外:
public void printIntegers(ArrayList list) {
list.forEach(System.out::println);
}
ArrayList a = new ArrayList();
printIntegers(a); // "incompatible types"
声明一个变量可以同时接受
阵列列表
或者它的任何子类,可以使用
ArrayList extends Number>
或
ArrayList super Number>
语法。
extends
通常用于在方法中使用(即读取)对象时,
super
当你要创作(即写作)时使用。考虑到打印输出很消耗,使用起来很安全
延伸
:
public void printNumbers(ArrayList extends Number> list) {
list.forEach(System.out::println);
}
ArrayList listInt = new ArrayList();
printNumbers(listInt); // works
ArrayList listDbl = new ArrayList();
printNumbers(listDbl); // also works