检查向量类型

时间:2018-08-27 20:52:25

标签: java generics vector

我想知道Vector是否持有<String><Integer>

我的功能public void printVector(Vector <?> v){

我尝试了if(v instanceof <String>),但编译器不允许。 有什么问题吗?

3 个答案:

答案 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作为方法参数。这样,您便可以检查该方法是否确实传递了CustomerEmployee的列表:

 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);

请注意,诉诸instanceofclass检查通常是不良的面向对象设计的标志,通常,您可以通过多态实现更优雅的解决方案,即覆盖print()用于不同对象类型的方法-或具有使用域对象的不同print()实现的单个toString()方法。