2015-02-19 4 views
2

Я один класс определен, как это:Проверьте родительский класс экземпляр дочернего класса

class Car { 

} 

и многие другие определены так:

class Audi extends Car { 

} 

class Seat extends Car { 

} 

class Mercedes extends Car { 

} 

class Opel extends Car { 

} 

... 

У меня есть ситуации, когда я получаю список из всех этих автомобилей, который определяется следующим образом:

List<Car> cars = new ArrayList<Car>(); 

В этом списке есть много разных автомобилей, так как я могу и какой из них Audi, какой из них - Seat и т. д.?

Я пытался сделать это для автомобилей, для которых я знаю, что они типа Audi:

Audi audi = (Audi) cars.get(0); 

Это бросает ClassCastException. Как справиться с этой ситуацией?

+0

Вы можете использовать instanceof, но это подрывает принципы ООП. Что ты пытаешься сделать? –

+0

"* как я могу узнать, какой из них Audi, какой из них Seat *", почему вы даже хотите это сделать? Разве у вашего класса «Автомобиль» уже нет всего необходимого вам метода? – Pshemo

+0

@AdrianLeonhard, я пытаюсь получить данные для конкретного автомобиля из списка автомобилей. Я получаю этот список из другого места и нуждаюсь в его обработке. – user3339562

ответ

5

Вы можете использовать instanceof:

Car car = cars.get(0); 
if (car instanceof Audi) { 
    // It's an Audi, now you can safely cast it 
    Audi audi = (Audi) car; 
    // ...do whatever needs to be done with the Audi 
} 

Однако на практике следует использовать instanceof экономно - это идет вразрез с принципами программирования объектно-ориентированного , См, например: Is This Use of the "instanceof" Operator Considered Bad Design?

3

Явное или нет, это будет делать трюк:

Car car = cars.get(0); 
if(car instanceof Audi) { 
    Audi audi = (Audi) car; 
} 
3

Проверьте с InstanceOf, например:

car instanceof Audi 

Это возвращает истину, если переменная автомобиль является экземпляром Audi, в противном случае возвращает ложь.

2

Вы можете использовать instanceof перед литьем. Например:

Car someCar = cars.get(0); 
Audi audi = null; 
if(someCar instanceof Audi){ 
audi = (Audi) someCar; 
} 
if(audi != null){ 
//... 

Но скорее всего, это плохая идея, потому что дженерики была введена, чтобы избежать использования литья и instanceof.

Смежные вопросы