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



