2014-04-21 3 views
2

하나의 클래스가 있다고 가정 해 봅시다. - Animal. 그리고 그것으로부터 상속받은 두 클래스가 있습니다 : Bird, Cat, Dog.수퍼 클래스 개체 목록에서 서브 클래스 얻기

이제 Animal 유형의 배열 목록을 만들고 여기에 하위 클래스의 인스턴스를 추가합니다.

private List<Animal> list = new ArrayList<Animal>(); 
list.add(new Bird()); 
list.add(new Bird()); 
list.add(new Cat()); 
list.add(new Dog()); 

은 그 때 나는 등

for(int i = 0; i < list.length; i++) 
{ 
    list.get(i).makeSound(); 
} 

좋아, 몇 가지 방법을 호출,이 목록을 통해 반복. 하지만 Bird 서브 클래스에 메소드를 추가하고자한다면, 이는 Animal 수퍼 클래스에서 구현되지 않을까요? 의이 말 fly() 방법 보자, 그래서 그 결과는 다음과 같습니다

for(int i = 0; i < list.length; i++) 
{ 
    list.get(i).makeSound(); 
    if(list.get(i) instanceof Bird) 
    { 
     list.get(i).fly(); // error here 
    } 
} 

그것은 의미가 있지만,이 오류가 발생합니다 - 기호를 찾을 수 없습니다. Animal 클래스에서 메서드를 구현하면 문제가 해결되는 것 같지만 두 번해야 할 때 내 눈이 아플 수 있습니다. 이 문제를 해결할 방법이 있습니까?

+0

이것은 무엇입니까? 'ArrayList list = new List ; 그 줄에 두 개의 컴파일 시간 오류 만 계산하면 ... –

+0

예, 죄송합니다. – khernik

답변

2

당신은 Bird으로 캐스팅해야합니다

((Bird)list.get(i)).fly(); 
1

이미 그것이 Bird의 것으로 확인되면, 당신이 캐스팅 할 수는 fly()를 호출 할 수있는 BirdAnimal.

if(list.get(i) instanceof Bird) 
{ 
    Bird bird = (Bird) list.get(i); 
    bird.fly(); 
} 
+1

리스트에서'i'를 두 번 가져 오는 것이 그다지 좋은 아이디어는 아닙니다. 그리고 어떤 경우에도 OP는 향상된 for 루프를 사용해야합니다. –

0

당신은 새의 인스턴스에 다시 '캐스트'하고 싶다.

for(Animal animal : list) 
{ 
    animal.makeSound(); 
    if(animal instanceof Bird) 
    { 
     ((Bird) animal).fly(); 
    } 
} 
0

는 동물 참조의 배열 만이 참조가 실제로 가리키는 알고, 필요 :

if(list.get(i) instanceof Bird) 
{ 
    Bird bird = ((Bird) list.get(i)); 
} 

나는 또한뿐만 아니라 루프 '각'로 루프를 다시 작성할 것 컴파일러가 캐스팅을 통해 컴파일 타임에 컴파일러가 해당 동물을 검사 할 것임을 알리도록합니다. 클래스 파일을 확인하고 거기에있는 경우 makeNoise metbod, 오류가 발생하지 않습니다, 런타임에 그것은 동물 가리킨다 그것을 실제로 가리키는 참조하십시오 클래스를 호출합니다 makeNoise metbod, 거기에 명시된 바와 같이 당신의 동물 계급에서는 makeNoise 방법이 없으므로, 캐스팅이 필요합니다. ...

관련 문제