Java使用instanceof但基于方法参数

时间:2014-10-16 20:27:05

标签: java object instanceof

我有3个对象

Car
SmallCar extends Car
LargeCar extends Car

使用这种方法我想在列表中计算特定类型的汽车:

public int availableCars(String carType) {
    int count = 0;
    for (Car i : fleet) {
        if (i instanceof SmallCar) {
            count++;
        }
    }
    return count;
}

传递给定的carType的最佳方法是什么(如果它是String或其他更好的东西)有类似的东西:

if (i instanceof carTypeGiven)

该方法返回特定类型的汽车数量。

1 个答案:

答案 0 :(得分:3)

传入类而不是指示所需类型的字符串。您可以使用以下通配符将其限制为Car的子类:Class<? extends Car>

public int availableCars(Class<? extends Car> carType) {
    int count = 0;
    for (Car car : fleet) {
        if (carType.isInstance(car)) {
            count++;
        }
    }
    return count;
}

使用Class.isInstance(Object)确定车队中的车辆是否属于所需类型。

使用Java 8的流可以更简洁地做到这一点(假设fleet是一个集合):

public long availableCars(Class<? extends Car> carType) {
    return fleet.stream().filter(carType::isInstance).count();
}

如果fleet是一个数组,则需要略有不同:

public long availableCars(Class<? extends Car> carType) {
    return Arrays.stream(fleet).filter(carType::isInstance).count();
}

请注意,我已将返回类型更改为long,因为Stream.count()返回的是int。您可以将返回类型保留为count(),并将结果从int转换为{{1}}。