2014-10-16 73 views
0

我有3個對象使用Java的instanceof但基於方法參數

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(如果它是字符串或其他更好的)類似的東西:

if (i instanceof carTypeGiven) 

該方法返回特定類型的多少輛汽車可用。

+0

然後,您需要兩個int計數變量smallCarCount和largeCarCount。總數當然是他們的總和。 – 2014-10-16 20:33:13

回答

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

+0

我認爲這是我正在尋找的!謝謝... – 2014-10-16 20:49:38

+0

+1爲包含Java 8流做這種過濾! – Krease 2014-10-16 21:06:16