2012-10-15 3 views
1

클래스 유형에 문제가 있습니다. 나는 수퍼 클래스 "식용"과 인터페이스 "다채로운"을 가지고있다. 모든 먹을 수있는 항목이 다채롭지는 않으므로 화려한 것은 특정 먹을 수있는 대상에만 구현됩니다. 나는 식용 항목의 ArrayList를 가져 와서 반복하고, 화려한 항목 만 포함하는 새로운 ArrayList를 반환하려고합니다. 내가 받고있어 오류는 이제ArrayList 반복 및 instanceof 검사를 충족하는 객체의 ArrayList 반환

가 어떻게이 제한 주위에 얻을 수있다 "타입의 ArrayList에서 (다채로운) 방법의 추가가 (식용) 인수 적용 할 수 없습니다"

입니까?

private ArrayList<Edible> elist; 
private ArrayList<Colorful> clist; 

public List<Colorful> getColorfulItems(){ 
    for(Edible x : elist) 
     if(x instanceof Colorful){ 
      clist.add(x); 
     } 
    return clist; 

    } 

답변

5

당신은 캐스트하셔야합니다 EdibleColorful에 -

if(x instanceof Colorful){ 
     clist.add((Colorful)x); 
} 

또는, typecase을 피하려면, WildCard로 ArrayList를 선언 - 선언함으로써

private ArrayList<? extends Colorful> clist; 

당신의 이 같은 ArrayListsubtype이 아닌 Colorful 인 것을 추가 할 수 있습니다. typecasting

또한 목록이 instance variable으로 선언되었으므로 수정 된 목록을 매번 반환하지 않아도됩니다. 따라서 변경 사항은 목록을 반환하지 않고 목록에 반영됩니다.

0

내가 반환 값으로 필드를 사용하여 저항 할 것입니다. 이 경우 바람직하지 않을 수있는 메소드를 호출 할 때마다 목록이 커집니다.

당신은 다른 유형을 선택할 수 있습니다

@SuppressWarnings("unchecked") 
public <T> List<T> selectItems(Class<T> clazz) { 
    List<T> ret = new ArrayList<T>(); 
    for (Edible x : elist) 
     if (clazz.isInstance(x)) 
      ret.add((T) x); 
    return ret; 
} 

과 방법보다 일반적인 만들 수 있습니다.

List<Serializable> serializableList = x.selectItems(Serializable.class); 
List<Colorful> colorfulList = x.selectItems(Colorful.class);