我想知道Vector是否持有<String>
或<Integer>
。
我的功能public void printVector(Vector <?> v){
我尝试了if(v instanceof <String>)
,但编译器不允许。
有什么问题吗?
答案 0 :(得分:0)
可能相关的代码示例:
import java.util.Iterator;
import java.util.Vector;
public class Cool {
public static void main(String[] args) {
Vector<Integer> v;
v = new Vector<>(5);
v.add(Integer.valueOf(5));
test(v);
}
private static void test(Vector<?> v) {
Iterator<?> iterator = v.iterator();
if (iterator.hasNext()) {
System.out.println(iterator.next().getClass());
}
}
}
这将打印出类java.lang.Integer。
您的“测试”方法将必须根据您感兴趣的一组超类(员工/客户/等)来检查类型。
此外,在Java中,通常认为使用向量是一种坏习惯。
答案 1 :(得分:0)
理论上,由于type erasure,您不知道。基本上,这意味着您无法在运行时获取向量的通用类型。
现在,在实际的应用程序中,如果您知道每个对象都属于同一类型,则可以获取第一个对象并使用instanceof检查其类型。
注意:这不是一个好习惯。如果可以,请避免这样做。正如其他人所说,您应该考虑Vector之外的其他集合。
注意:根据经验,使用instanceof
是设计缺陷的线索。而且,这是一项昂贵的操作。
如果没有第一个元素,则您的数组为空,因此可以将其删除。
答案 2 :(得分:0)
如前所述,Java的类型擦除将使编译时通用类型信息在运行时不可用。
一个常见的解决方法是传递通用参数的Class
作为方法参数。这样,您便可以检查该方法是否确实传递了Customer
或Employee
的列表:
public void print(List<?> list, Class<?> clazz) {
if (clazz == Employee.class) {
// ...
} else if (clazz == Customer.class) {
// ...
} else {
// ...
}
}
然后可以按如下所示调用方法:
Vector<Employee> legacy = new Vector<>();
// do stuff
print(legacy, Employee.class);
请注意,诉诸instanceof
或class
检查通常是不良的面向对象设计的标志,通常,您可以通过多态实现更优雅的解决方案,即覆盖print()
用于不同对象类型的方法-或具有使用域对象的不同print()
实现的单个toString()
方法。