2015-01-27 3 views
2

내 ArrayList 내부의 객체를 반복하고 인쇄하는 좋은 방법을 찾으려고합니다.객체가있는 수퍼 클래스의 필드에 연결할 수 없습니다.

문제는 내가 사용자가 개체의 정보 (예 : 색상 및 브랜드)를 입력하는 필드에 도달하지 못하는 것입니다.

Vehicle C = new Car(4, "Blue", "Honda"); 

자동차 (및 자전거, 버스 등 다른 클래스) 차량의 서브 클래스 :

객체의 새로운 인스턴스는 다음과 같습니다.

Vehicle 클래스 :

public class Vehicle { 

public int pass = 0; 
public int cost = 0; 
public int size = 0; 
public String brand = ""; 
public String color = ""; 

public Vehicle(){} 

}

Car 클래스 :

public class Car extends Vehicle{ 

// constructor 
public Car(int passengers, String col, String brandOfVehicle){ 
    if (passengers < 0 || passengers > 4){ 
     throw new IllegalArgumentException(); 
    }else 
     pass = passengers; 
     cost += pass*15 + 100; 
     size = 5; 
     color = col; 
     brand = brandOfVehicle; 
} 

} 객체를 반복하려고 :

 Iterator<Object> it = Ferry.iterator(); 
    while(it.hasNext()){ 
     Object i = it.next(); 
     System.out.println(i + " "); 
    } 

W를 개체를 반복하는 암탉은 i.color에서와 같이 색과 브랜드 문자열에 도달하고 싶습니다. 하지만 나는 그것이 새로운 Object 인 것 같기 때문에 자동차, 버스 등과 관련된 필드와 메서드에 대한 액세스를 얻지 못했을 것입니다.

이 문제를 해결할 수있는 방법이 있습니까? 아니면 실제 문제가 아닌가?

+0

아마도 내 모든 객체가 Ferry –

답변

2

, 그러나 아마 Ferry.iterator()Iterator<Object> 대신 Iterator<Vehicle>를 반환해야합니다 :

또는 유일한 Vehicle이 페리를 액세스 할 수있는 경우에 목록을 변경할 수 있습니다

.

it.next() 그러면 Vehicle에 대한 참조가 반환되어 Vehicle의 모든 공용 멤버에 액세스 할 수 있습니다.

Iterator<Object> it = Ferry.iterator(); 
while(it.hasNext()){ 
    Object i = it.next(); 
    if (i instanceof Vehicle) 
     System.out.println(((Vehicle)i).color); 
} 
+0

이라는 ArrayList에 저장된다는 사실에 주목할 가치가 있습니다. 나는 upvote 할 수 있었으면 좋겠어요.이 모든 대답은 훌륭했습니다! 고맙습니다! –

0

캐스트 vihecle에 객체와 그것을 작동 :

Iterator<Object> it = Ferry.iterator(); 
while(it.hasNext()){ 
    Vehicle i = (Vehicle)it.next(); 
    System.out.println(i + " "); 
} 

당신이 Vehicle에서 서브 클래스가있는 경우도 확인하고 캐스트를 만들 수 있습니다. 내가 Ferry의 유형이 무엇인지 모르는

Iterator<Vehicle> it = Ferry.iterator(); 
while(it.hasNext()){ 
    Vehicle i = it.next(); 
    System.out.println(i + " "); 
} 
0

Ferry 유형 List<Vehicle>에 재 선언 : Ferry하지 Vehicle를 개체를 포함 할 수 있습니다

Iterator<Vehicle> it = Ferry.iterator(); 
while(it.hasNext()){ 
    Vehicle i = it.next(); 
    System.out.println(i.color); 
} 

경우에, 당신은 캐스팅을 사용해야합니다.

그럼 당신은

Iterator<Vehicle> it = Ferry.iterator(); 
while(it.hasNext()){ 
    Vehicle i = it.next(); 
    System.out.println(i + " "); 
} 

심지어 간단한처럼 사용할 수 있습니다 변수 이름이 더 읽기 코드에 대한 자바 소문자해야한다는

List<Vehicle> ferry = ...; 
while(Vehicle v: ferry)){ 
    System.out.println(v + " "); 
} 

참고.

0
Iterator<Vehicle > it = Ferry.iterator(); 
while(it.hasNext()){ 
    Vehicle i = it.next(); 
    System.out.println(i + " "); 
} 

차량의 수퍼 클래스 인 Object 유형으로 캐스팅했기 때문에 속성에 액세스 할 수 없습니다.