2011-08-19 2 views
7

구체적인 유형의 목록을 Java 인터페이스 목록에 캐스트 할 수 있습니까?구체적인 유형의 목록을 Java의 인터페이스 목록에 캐스트하십시오.

예를 들어

: 사전에

public class Square implements Shape { ... } 

public SquareRepository implements Repository { 

    private List<Square> squares; 

    @Override 
    public List<Shape> getShapes() { 
    return squares; // how can I return this list of shapes properly cast? 
    } 

} 

감사합니다,

답변

11

당신은 기본 목록으로 사용되는 generic wildcards의 사용은 파생 목록 수 있도록 할 수 있습니다 :

public List<? extends Shape> getShapes() { ... } 

반환 된 목록 은 null이 아닌 항목이 추가되었습니다.. (Sauer가 지적했듯이 null을 추가 할 수 있으며 삭제도 문제가되지 않습니다.) 트레이드 오프이지만, 문제가되지는 않을 것입니다.

getShapes()은 대체이므로 Repository의 반환 유형을 업데이트해야합니다.

+1

작동 할 수 있습니다 "*가 쓸 수 없습니다 *"되어 있지 * 정확한 완전히 * : 당신 여전히 'null'을 추가하고 요소를 제거 할 수 있습니다. –

+0

감사합니다. 이를 반영하도록 업데이트되었습니다. – dlev

+0

내 사건에서 "그"문제가 있다면? – osrl

3

Repository 인터페이스를 제어하는 ​​경우 대신 List<? extends Shape> 유형을 반환하도록 리팩토링하는 것이 좋습니다.

이 잘 컴파일 :

interface Shape { } 

class Square implements Shape { } 

interface Repository { 
    List<? extends Shape> getShapes(); 
} 

class SquareRepository implements Repository { 
    private List<Square> squares; 

    @Override 
    public List<? extends Shape> getShapes() { 
     return squares; 
    } 
} 
4

당신이 정말로 등이 뭔가를 원한다면 아래

@Override 
public List<Shape> getShapes() { 
    return new ArrayList<Shape>(squares); 
} 
+0

좋아요. "? extends"를 다루는 것보다 훨씬 더 깔끔함 – yurgis

+0

목록의 사본을 생성한다는 점에 유의하십시오. 긴 목록 및/또는 시간이 중요한 응용 프로그램과 관련있을 수 있습니다. –

관련 문제