2011-11-01 8 views
2

ArrayList에 하위 클래스 속성이 표시되는 데 문제가 있습니다.ArrayList가 서브 클래스 변수를 인식하지 못합니다.

여기 내 코드의 주요 부분에 대한 설명이 나와 있습니다.

private ArrayList<Person> people = new ArrayList<Person>; 

abstract class Person { 
String fName; 
String lName; 
} 

public class Employee extends Person { 
protected int empID; 
} 

public class Client extends Person { 
protected int clientID; 
} 

된 ClientID별로 검색 루프를 사용하는 경우, 내가

Enterprise.java:134 무엇입니까 : 기호를 찾을 수 없습니다 기호 : 변수 clientid는 위치 : Person 클래스

내가 시도 with 루프에 instanceof 클라이언트가 있거나없는 경우. for 루프 매개 변수에서 Person 대신 Client를 사용하려고 시도했습니다.

for(Person x : people) { 
if(x.clientID == cid) { 
    System.out.println(x); 
} 

이러한 클래스를 하위 클래스로 바꾸기 전에 해당 클래스를 자신의 종류의 ArrayList에 넣었으며 모든 것이 완벽하게 작동했습니다.

도움이 될 것입니다.

+0

사람들 목록에 Client 인스턴스 만 포함되어 있습니까? 그렇지 않으면 오류가 발생합니다. 나는 또한'x.clientID'를 시도하기 전에'x'를'Client'로 던지지 않는 한 당신이 올린 코드가 어떻게 컴파일되는지를 보지 못합니다.'((Client) x) .clientID == cid'와 같은 것 –

답변

4

당신은 별도의 목록에 넣어하거나 캐스팅 중 하나가 :

for (Person person : people) { 
    if (person instanceof Client) { 
    Client client = (Client) person; 
    if (client.clientID == cid) { 
     System.out.println("found!"); 
    } 
    } 
} 
+1

대단히 감사합니다! 내가 어떻게 잊어 버렸는지 모르겠다. 약 2 주 전에 자세히 보았습니다. –

0

개인 인스턴스 변수를 사용하고 있습니다. 자신의 클래스 바깥에는 아무 것도 볼 수 없습니다. 보호 또는 공공 기관으로 변경하십시오. 변수를 수정하고 문제를 해결해야합니다.

또한이 코드

x.clientID == cid 

는 사람이 추상 클래스의 인스턴스 변수를 찾고,하고 컴파일러 오류가 그러한 변수가 없기 때문이다.

감사합니다.

+0

죄송합니다. 실제로 보호받는 것으로 표시 될 예정이며 질문을 입력 할 때 간과 할 수 있습니다. 편집 된 OP도 있습니다. –

+0

당신도 걱정하지 않아도됩니다. 변수는 클래스의 일부입니다. Person 클래스에는 cliendID가 없으므로 X.clientID는 작동하지 않습니다. – Mechkov

0

을 당신은 캐스팅하는 데 필요한 PersonClient A와 :

((Client) x).clientId; 
0

점은 ClientID 속성은 '아무튼이다 Person은 Person 클래스에 속합니다. 객체를 다운 캐스트하려면 다음과 같이 instanceof를 사용하십시오.

for(Person x : people) { 
    if (x instanceof Client){ 
     Client c = (Client) x; 
     if(c.clientID == cid) { 
      System.out.println(x); 
     } 
} 

비록 이것이 가능하다해도, 종종 디자인 문제가 있다는 신호입니다. 아마도 Person의 다른 하위 클래스를 다른 ArrayList에 저장하는 등 코드를 리팩터링해야 할 수 있습니다.

관련 문제