小编典典
在运行时不可恢复(某些特殊情况除外)。这意味着在运行时,Vector和Vector都只是Vectors,而它们的元素也只是Object引用。
只有instanceof单个元素的实际运行时类(可以通过检查发现)才能确定元素类型,否则Vector本身不知道其元素类型是什么。
因此,基本上,任何类型的空向量都等于任何其他类型的 空 向量。像这样强制转换甚至是安全的:
Vector noStrings = (Vector) new Vector();
但是,存在一个问题,因为尽管您可以说 空 向量符合任何必需的元素类型,但是 只要向量保持为空 ,该语句就成立。因为如果您这样做:
Vector ints = new Vector(); // empty
Vector strings = (Vector) ints; // unchecked warning, but still possibly ok
ints.add(1); // here comes trouble
String s = strings.get(1); // oh oh, ClassCastException
编辑:
回答您的第二个问题:不,不可能这样写:
public boolean checkType(Vector vec) {
return T instanceof Integer; // impossible
return T == Integer; // impossible
return T.class == Integer.class // impossible
return vec instanceof (Vector); // impossible
}
但是,您可以编写一个使用类标记作为输入参数的方法:
static boolean checkElementType(Collection> collection, Class elementType) {
for (Object object : collection) {
if (!elementType.isAssignableFrom(object.getClass())) {
return false;
}
}
return true;
}
然后您可以像这样使用它:
List> list1 = Arrays.asList(1, 2, 3);
List> list2 = Arrays.asList(1, 2, 3, "a");
System.out.println(checkElementType(list1, Integer.class)); // true
System.out.println(checkElementType(list2, Integer.class)); // false
2020-11-23